zoukankan      html  css  js  c++  java
  • PyQuery

    PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,

    PyQuery 是 Python 仿照 jQuery 的严格实现。语法与 jQuery 几乎完全相同。

    安装

    pip install pyquery
    

    官网地址:http://pyquery.readthedocs.io/en/latest/
    jQuery参考文档: http://jquery.cuishifeng.cn/

    初始化

    初始化的时候一般有三种传入方式:传入字符串,传入url,传入文件

    字符串初始

    html = '''
    <div>
        <ul>
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    print(doc('li'))
    

    由于PyQuery写起来比较麻烦,所以我们导入的时候都会添加别名:
    from pyquery import PyQuery as pq

    这里我们可以知道上述代码中的doc其实就是一个pyquery对象,我们可以通过doc可以进行元素的选择,其实这里就是一个css选择器,所以CSS选择器的规则都可以用,直接doc(标签名)就可以获取所有的该标签的内容,如果想要获取class 则doc('.class_name'),如果是id则doc('#id_name')....

    URL初始化

    from pyquery import PyQuery as pq
    doc = pq(url='https://www.cnblogs.com/',encoding='utf-8')
    print(doc('.post_nav_block li a'))
    

      

    文件初始化

    我们在pq()这里可以传入url参数也可以传入文件参数,当然这里的文件通常是一个html文件,例如:pq(filename='index.html')

    基本CSS选择器

    from pyquery import PyQuery as pq
    
    html = '''<div>
        <ul id = 'haha'>
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul></div>'''
    
    doc = pq(html)
    # print(doc)
    # id等于haha下面的class等于item-0下的a标签下的span标签(注意层级关系以空格隔开)
    print(doc('#haha .item-0 a span'))
    
    -----------输出
    <span class="bold">third item</span>
    

    常用的CSS选择器方法:

     查找节点

    下面我们介绍一些常用的查询函数,这些函数和jQuery中函数的用法完全相同。

    子节点

    查找子节点时,需要用到find()方法,此时传入的参数是CSS选择器。这里还是以前面的HTML为例:

    html = '''
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    items = doc('.list')
    print(type(items))
    print(items)
    lis = items.find('li')
    print(type(lis))
    print(lis)
    

    上述中的代码中的items.find('li') 则表示查找ul里的所有的li标签
    当然这里通过children可以实现同样的效果,并且通过.children方法得到的结果也是一个pyquery对象

    li = items.children()
    print(type(li))
    print(li)
    

    同时在children里也可以用CSS选择器

    li2 = items.children('.active') print(li2)

    父元素

    parent,parents方法

    通过.parent就可以找到父元素的内容

    html = '''
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    items = doc('.list')
    # print(type(items))
    # print(items)
    container = items.parent()
    print(type(container))
    print(container)
    

      通过.parents就可以找到祖先节点的内容,例子如下:

    html = '''
    <div class="wrap">
        <div id="container">
            <ul class="list">
                 <li class="item-0">first item</li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
                 <li class="item-1 active"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a></li>
             </ul>
         </div>
     </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    items = doc('.list')
    parents = items.parents()
    print(type(parents))
    print(parents)
    

     

    兄弟元素

    siblings

    html = '''
    <div class="wrap">
        <div id="container">
            <ul class="list">
                 <li class="item-0">first item</li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
                 <li class="item-1 active"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a></li>
             </ul>
         </div>
     </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc('.list .item-0.active')
    print(li.siblings())
    
    -----------输出
    <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-0">first item</li>
                 <li class="item-1 active"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a></li>
    

    代码中doc('.list .item-0.active') 中的.tem-0和.active是紧挨着的,所以表示是并的关系,这样满足条件的就剩下一个了,这样在通过.siblings就可以获取所有的兄弟标签,当然这里是不包括自己的。

    遍历

    html = '''
    <div class="wrap">
        <div id="container">
            <ul class="list">
                 <li class="item-0">first item</li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
                 <li class="item-1 active"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a></li>
             </ul>
         </div>
    </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    lis = doc('li').items()
    print(type(lis))
    for li in lis:
        print(type(li))
        print(li)
    
    ----输出---------------
    
    <class 'generator'>
    <class 'pyquery.pyquery.PyQuery'>
    <li class="item-0">first item</li>
                 
    <class 'pyquery.pyquery.PyQuery'>
    <li class="item-1"><a href="link2.html">second item</a></li>
                 
    <class 'pyquery.pyquery.PyQuery'>
    <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
                 
    <class 'pyquery.pyquery.PyQuery'>
    <li class="item-1 active"><a href="link4.html">fourth item</a></li>
                 
    <class 'pyquery.pyquery.PyQuery'>
    <li class="item-0"><a href="link5.html">fifth item</a></li>
    

     通过items()可以得到一个生成器,并且我们通过for循环得到的每个元素依然是一个pyquery对象

    获取信息

    获取属性
    pyquery对象.attr(属性名)
    pyquery对象.attr.属性名

    from pyquery import PyQuery as pq
    
    html = '''<div class=‘content’>
        <ul id = 'haha'>
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul></div>'''
    
    doc = pq(html)
    # 注意class=item-0 active是一个class的属性,但是在pyquery里面要是中间也是空格隔开的话,
    # 就变成了item-0下的active标签下的a标签了,所以这里空格必须改成点
    item = doc(".item-0.active a")
    print(item)
    # 获取属性值的两种方法
    print(item.attr.href)
    print(item.attr('href'))
    
    
    ----输出-----
    <class 'pyquery.pyquery.PyQuery'>
    <a href="link3.html"><span class="bold">third item</span></a>
    link3.html
    link3.html
    

     获取文本
    在很多时候我们是需要获取被html标签包含的文本信息,通过.text()就可以获取文本信息

    from pyquery import PyQuery as pq
    
    html = '''<div class=‘content’>
        <ul id = 'haha'>
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul></div>'''
    
    doc = pq(html)
    a = doc(".item-0.active a").text()
    print(a)
    
    -------输出------
    third item
    

      获取html
    我们通过.html()的方式可以获取当前标签所包含的html信息

    html = '''
    <div class="wrap">
        <div id="container">
            <ul class="list">
                 <li class="item-0">first item</li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
                 <li class="item-1 active"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a></li>
             </ul>
         </div>
     </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc('.item-0.active')
    print(li.html())
    print(li.children())
    print(li.find('a'))
    
    
    -------------输出
    
    <a href="link3.html"><span class="bold">third item</span></a>
    <a href="link3.html"><span class="bold">third item</span></a>
    <a href="link3.html"><span class="bold">third item</span></a>
    

      

    Dom操作

    1、属性的增加删除操作

    html = '''
    <div class="wrap">
        <div id="container">
            <ul class="list">
                 <li class="item-0">first item</li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
                 <li class="item-1 active"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a></li>
             </ul>
         </div>
     </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc('.item-0.active')
    print(li)
    li.removeClass('active')
    print(li)
    li.addClass('active')
    print(li)
    
    
    ---------------------输出
    <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
                 
    <li class="item-0"><a href="link3.html"><span class="bold">third item</span></a></li>
                 
    <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
    

      

    2、attrs和css

      注意:下列操作有则改之,无则加之。

    html = '''
    <div class="wrap">
        <div id="container">
            <ul class="list">
                 <li class="item-0">first item</li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
                 <li class="item-1 active"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a></li>
             </ul>
         </div>
     </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc('.item-0.active')
    print(li)
    li.attr('name', 'link')
    print(li)
    li.css('font-size', '14px')
    print(li)
    li.css('font-size', '12px')
    print(li)
    
    
    
    
    ------------------输出
    <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
                 
    <li class="item-0 active" name="link"><a href="link3.html"><span class="bold">third item</span></a></li>
                 
    <li class="item-0 active" name="link" style="font-size: 14px"><a href="link3.html"><span class="bold">third item</span></a></li>
                 
    <li class="item-0 active" name="link" style="font-size: 12px"><a href="link3.html"><span class="bold">third item</span></a></li>
    

      

    3.删除某个标签

    有时候我们获取文本信息的时候可能并列的会有一些其他标签干扰,这个时候通过remove就可以将无用的或者干扰的标签直接删除,从而方便操作

    html = '''
    <div class="wrap">
        Hello, World
        <p>This is a paragraph.</p>
     </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    wrap = doc('.wrap')
    print(wrap.text())
    wrap.find('p').remove()
    print(wrap.text())
    
    --------输出
    Hello, World
    This is a paragraph.
    Hello, World
    

      

    参考:http://www.cnblogs.com/zhaof/p/6935473.html

     

      

      

  • 相关阅读:
    python反爬之js混淆-字符串映射
    How to Provide a Default Trace for a Cloud Application
    Reset Peak Used Memory
    SAP 课程
    note 1639578 and 1622837
    SAP License error
    SAP BASIS-System Move
    初识Agile(敏捷项目管理)
    SAP HANA升级
    SAP FIORI 部署
  • 原文地址:https://www.cnblogs.com/xiao-apple36/p/9540751.html
Copyright © 2011-2022 走看看