• pyquery解析库


    这一篇整理一下pyquery这个解析库。还是菜,若有错误的地方,欢迎大家随时指正。。。。。。。(come on.......)

    pyquery:是一个css选择器,再使用时,也需要传入HTML文本来初始化一个PyQuery对象。但它的初始化方式有多种,比如直接传入字符串,传入URL,传入文件名,等等。还是先声明一下那个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>
         <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>
    '''
    View Code

    (1)建立文档树:

    字符串初始化:

    1 from pyquery import PyQuery as pq
    2 pq_tree = pq(html)

    第一行,从pyquery里面引入PyQuery类,并起别名为pq,第二行,直接把字符串放在pq后面,这样就建立了文档树

    url初始化:初始化的参数不仅可以以字符串的形式传递,还可以传入网页的URL,此时只需要指定参数为url即可。举个栗子

    1 from pyquery import PyQuery as pq
    2 doc = pq(url='https://www.baidu.com')

    文件初始化:除了传递URL,还可以传递本地的文件名,此时将参数指定为filename即可。举个例子

    from pyquery import PyQuery as pq

    doc = pq(filename='baidu.html')
    print(doc('li'))
     
    (2)css选择器:用一个实例来感受pyquery的CSS选择器的用法
    1 pq_tree = pq(html)
    2 ul_list = pq_tree('#container .list li')
    3 print(ul_list)
    4 print(type(ul_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>
         <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>
         
    <class 'pyquery.pyquery.PyQuery'>

    第一行,用字符串的方法建立了文档树,第二行代码表示的是再这个文档树中先搜索出id属性为container 的标签;然后再找到下面class属性为list 的标签,并在此节点下找出所有的li标签

    第四行,用type查看ul_list的类型,可以看到,是一个PyQuery的对象。

    (3)遍历:刚才可以观察到,pyquery的选择结果可能是多个节点,也可能是单个节点,类型都是PyQuery类型,并没有返回像Beautiful Soup那样的列表。对于多个节点的结果,我们需要遍历来获取了。遍历是使用items()方法

    1 pq_tree = pq(html)
    2 ul_list = pq_tree('#container .list')
    3 for ul in ul_list.items():
    4     print('*'*50)
    5     print(type(ul))
    6     print('*'*50)
    7     li_list = ul('li')
    8     for li in li_list.items():
    9         print(li, end='')

    输出结果如下:
    **************************************************
    <class 'pyquery.pyquery.PyQuery'>
    **************************************************
    <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>
    **************************************************
    <class 'pyquery.pyquery.PyQuery'>
    **************************************************
    <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>

    上面的代码是遍历出li标签

    第二行,利用属性选择找出了两个ul标签,第三行,再利用for循环遍历的时候,我们再ul_list后面加了items()方法,这就让ul_list变成了一个生成器,逐个得到ul节点对象。然后第五行,利用type查看ul的类型,是PyQuery类型,第七行,在ul标签里面搜索出所有的li标签,赋值给li_list对象,第八行,对li_list使用items(),遍历出每个ul标签里面的li标签。当然,你也可以直接找到ul下所有的li标签,然后运用items()方法进行遍历,像这样:

    1 pq_tree = pq(html)
    2 li_list = pq_tree('#container .list li')
    3 for li in li_list.items():
    4     print(li, end='')

    (4):查找子节点,并根据属性过滤。

    上面那种方法,能帮助我们获取一个节点内指定的子节点,但却无法根据属性进行查找,比如:只需要class属性为item-0的li标签。这时,我们可以用find()方法:

    1 pq_tree = pq(html)
    2 ul_list = pq_tree('#container .list')
    3 li_list = ul_list.find('.item-0') //使用children可以同时对属性和节点名进行过滤,如: .children('p[class=item]')
    4 for li in li_list.items():
    5     print(li, end='')

    输出结果如下:
    <li class="item-0">first item</li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         <li class="item-0">first item</li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>

    第二行代码,找到两个ul标签,第三行中,在ul中找到所有class属性为item-0的li标签,第四行,利用items()方法对结果进行遍历输出

    (5)获取文本和属性:获取节点之后的另一个主要操作就是获取其内部的文本和属性了,此时可以调用text()方法和attrs()方法来实现。稍微改一下上面的代码

    1 pq_tree = pq(html)
    2 ul_list = pq_tree('#container .list')
    3 li_list = ul_list.find('.item-0')
    4 for li in li_list.items():
    5     print('文本内容是:',li.text(), '	',  'class属性是:',li.attr('class'))

    输出结果是:
    文本内容是: first item      class属性是: item-0
    文本内容是: third item      class属性是: item-0 active
    文本内容是: fifth item      class属性是: item-0
    文本内容是: first item      class属性是: item-0
    文本内容是: third item      class属性是: item-0 active
    文本内容是: fifth item      class属性是: item-0

    有很多没说到的地方,应该也有一些我没发觉的错误,欢迎大家随时指正。。。。参考文章:https://cuiqingcai.com/5551.html

    ******************************不积跬步,无以至千里。******************************

  • 相关阅读:
    移动端和pc端的判断,不同端做不同的处理
    easyUI combobox的使用
    [Codeforces #196] Tutorial
    [Codeforces #174] Tutorial
    [Codeforces #190] Tutorial
    [Codeforces #211] Tutorial
    [Codeforces #192] Tutorial
    [BZOJ 3196] 二逼平衡树
    [BZOJ 1058] 报表统计
    [P3709] 大爷的字符串题
  • 原文地址:https://www.cnblogs.com/liangshian/p/11303142.html
Copyright © 2020-2023  润新知