返回

一步一步学爬虫(3)网页解析之pyquery的使用

发布时间:2023-01-12 06:40:32 303
# html# webkit# python# 爬虫

(一步一步学爬虫(3)网页解析之pyquery的使用)

3.3 一步一步学爬虫(3)网页解析之pyquery的使用

本来不想再抄写这部分内容,但是看了下这个方法的使用,有这么多重要的功能,还是抄写在这里,方便自己查阅,书本太厚,真的不如App方便。 上一篇的BeautifulSoup的方法,有许多不方便的,再学习pyquery的强大功能,特别是CSS方法。

3.3.1 准备工作

  • 还是安装 pip3 install pyquery

3.3.2 初始化

  • 在pyquery库解析HTML文本的时候,需要把这个页面初始化为一个pyquery对象。

字符串初始化

# -*- coding: UTF-8 -*-
html = '''
<html>
  <body>
    <div id="container">
      <ul class="list">
        <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
        <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
        <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
        <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
        <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
      </ul>
    </div>
  </body>
</html>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('li'))
  • 上面使用CSS选择器,传入li节点,可以选择所有的li节点了。
<li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
<li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
<li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
<li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
<li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>

URL初始化

from pyquery import PyQuery as pq
doc = pq(url='https://cuiqingcai.com')
print(doc('title'))
  • 运行结果。
<title>静觅丨崔庆才的个人站点 - Python爬虫教程</title>

文件初始化

  • 除了上面两种情况,还可以传入本地文件名,进行初始化。
doc = pq(filename='demo.html')
print(doc('li'))

3.3.3 基本CSS选择器

html = '''
<html>
  <body>
    <div id="container">
      <ul class="list">
        <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
        <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
        <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
        <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
        <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
      </ul>
    </div>
  </body>
</html>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))
  • 这个代码的意思是,用CSS选择器,选取id为container的节点,再选取其内部class为list的节点内部的所有li节点。

  • 当然,可以在上代码基础上,继续调用text方法,得到里面的内容。

    for item in doc('#container .list li').items():
        print(item.text())
    
  • 得到如下结果。

    first item
    second item
    third item
    fourth item
    fifth item
    
    • 显然,用这个办法,比正则表达式,还要省事。

3.3.4 查找节点

(1)子节点

  • 接着上面HTML代码,再用find方法,加上其参数CSS选择器,查找子节点。

    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)
    
  • 运行结果如下:

    <class 'pyquery.pyquery.PyQuery'>
    <ul class="list">
            <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
            <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
            <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
            <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
            <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
          </ul>
        
    <class 'pyquery.pyquery.PyQuery'>
    <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
            <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
            <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
            <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
            <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
    

(2)父节点

  • 父节点就是把children换成parent即可。

    items = doc('.list')
    lis = items.parent()
    print(type(lis))
    print(lis)
    
  • 结果是上层div的内容。

    <class 'pyquery.pyquery.PyQuery'>
    <div id="container">
          <ul class="list">
            <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
            <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
            <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
            <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
            <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
          </ul>
        </div>
    
  • 如果想获取祖先节点,可以用parents方法。

    items = doc('.list')
    lis = items.parents()
    print(type(lis))
    print(lis)
    
  • 这个方法会把所有父节点、祖先节点都选了出来,要想定位到某一个祖先节点,再加上一个CSS选择器即可。如:

    # -*- coding: UTF-8 -*-
    html = '''
    <html>
      <div class="wrap">
        <div id="container">
          <ul class="list">
            <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
            <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
            <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
            <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
            <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
          </ul>
        </div>
      </div>
    </html>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    
    items = doc('.list')
    lis = items.parents('.wrap')
    print(type(lis))
    print(lis)

(3)兄弟节点

  • 还是上面的例子,兄弟节点用到了siblings方法。

    # -*- coding: UTF-8 -*-
    html = '''
    <html>
      <div class="wrap">
        <div id="container">
          <ul class="list">
            <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
            <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
            <li class="item-0 active"><a rel="nofollow" href="link3.html">third item</a></li>
            <li class="item-1 active"><a rel="nofollow" href="link4.html">fourth item</a></li>
            <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
          </ul>
        </div>
      </div>
    </html>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    
    li = doc('.list .item-0.active')
    lis = li.siblings()
    print(type(lis))
    print(lis)
    
  • 结果如下:

    <class 'pyquery.pyquery.PyQuery'>
    
    <li class="item-1 active"><a rel="nofollow" href="link4.html">fourth item</a></li>

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线