3.3 pyquery 的使用

目录

一. pyquery介绍以及安装

1.  pyquery介绍

2. pyquery安装

二. 初始化

1 .字符串初始化

2. URL 初始化

3. 文件初始化

三. 基本 CSS 选择器

四. 查找节点(子父兄弟)

五. 获取节点属性值和文本

1. 获取属性值

2. 获取文本

六. 遍历节点

七. 伪类选择器


一. pyquery介绍以及安装

1.  pyquery介绍

        网页解析库,与XPath、BeautifulSoup异曲同工之妙,比起两个库在使用CSS选择器方面更加方便。

2. pyquery安装

conda install pyquery    # 安装了anaconda

二. 初始化

        初始化 pyquery 的时候,需要传入 HTML 文本来初始化一个 PyQuery 对象。它的初始化方式有多种,比如直接传入字符串,传入 URL,传入文件名,等等。

1 .字符串初始化

from pyquery import PyQuery as pq

html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
     </ul>
 </div>
'''

doc = pq(html)
print(doc('li'))
输出:
 <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>

       首先引入 PyQuery 这个对象,取别名为 pq。然后声明了一个长 HTML 字符串,并将其当作参数传递给 PyQuery 类传给实例 doc ,这样就成功完成了初始化。接下来,在初始化的对象(实例中)传入 CSS 选择器。在这个实例中,我们传入 li 节点,这样就可以选择所有的 li 节点。

2. URL 初始化

        直接传入 url。例如下方代码中的链接中有个 title 节点。

from pyquery import PyQuery as pq
import requests

url = 'http://cuiqingcai.com'
doc = pq(url)   # 等同于下方代码
# doc = pq(requests.get(url).text)
print(doc('title'))
输出:<title>静觅丨崔庆才的个人站点 - Python爬虫教程</title>

3. 文件初始化

        传递本地的文件名,参数指定为 filename 即可:

from pyquery import PyQuery as pq
doc = pq(filename='demo.html')
print(doc('li'))

三. 基本 CSS 选择器

        我们首先用一个实例来感受一下 pyquery 的 CSS 选择器的用法:

from pyquery import PyQuery as pq

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>
'''

doc = pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list 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'>

        这里我们初始化 PyQuery 对象之后,传入了一个 CSS 选择器 #container .list li,然后,打印输出。可以看到,我们成功获取到了符合条件的节点。最后,将它的类型打印输出,类型是 PyQuery 类型。

四. 查找节点(子父兄弟)

        首先确定一个节点,用 find() 方法找子孙节点,用 children() 方法找子节点,用 parent()、parents() 找父节点、祖先节点,用 siblings() 找兄弟节点,在()中传入 CSS 选择器可选中具体节点。

from pyquery import PyQuery as pq

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>
'''

doc = pq(html)

items = doc('.list')    # class为 list 的节点
print('class为 list 的节点:')
print(items)

lis = items.find('li')  # 找子孙节点
print('.list 的节点中子孙节点:')
print(lis)

lis2 = items.children('a')     # 找子节点,可传入CSS选择器找特定节点
print('.list 的节点中子节点找 a 节点:')
print(lis2)

if not lis2:
    print('空')

parent = items.parent()  # 父节点
print('.list 的父节点:')
print(parent)

parents = items.parents()   # 祖先节点(包括父节点)
print('.list 的祖先节点:')
print(parents)

li = doc('.list .item-0.active')
print('.item-0.active 的兄弟节点:')
print(li.siblings())    # 兄弟节点

结果如下:

class为 list 的节点:
<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>
     
.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>
         
.list 的节点中子节点找 a 节点:

空
.list 的父节点:
<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>
 
.list 的祖先节点:
<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><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>
 
.item-0.active 的兄弟节点:
<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>

五. 获取节点属性值和文本

        我们可以从上面看到节点的返回结果有些是多个,所以如果是多个节点就要便利获取属性和文本。

1. 获取属性值

节点对象.attr('class/herf等属性') # 获得属性值
等同:
节点对象.attr.属性

        节点若有多个,上面方法只会返回一个值,所以要便利节点。

from pyquery import PyQuery as pq

doc = pq(html)    # html 同上
lis = doc('ul li')
print(lis.attr('class'))    # 输出:item-0

2. 获取文本

        这里的文本有两种,一种是 html 文本,一种是纯文本(不含HTML内容)。示例如下:示例html部分内容

        <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>
from pyquery import PyQuery as pq

doc = pq(html)
li = doc('ul .item-1')
print(li.html(), type(li.html()))
print(li.text(), type(li.text()))

结果如下:

<a href="link2.html">second item</a> <class 'str'>
second item fourth item <class 'str'>

        我们发现 html 内容只返回一个,纯文本内容返回两个 li 节点内容。所以 html() 方法与 attr() 方法类似,只会返回一个内容。而 text() 方法会返回节点的所有纯文本内容,要想得到单一的就指定节点。

六. 遍历节点

        我们从上面得到的节点对象都是 PyQuery 类型,单个节点,可以直接通过节点对象. 来获取属性值及文本,那多个节点呢?

        多个节点,我们可以通过 doc().items() 来获得生成器,然后 for 遍历单个节点,就可以对单个节点操作了。

七. 伪类选择器

        CSS 选择器之所以强大,还有一个很重要的原因,那就是它支持多种多样的伪类选择器,例如选择第一个节点、最后一个节点、奇偶数节点、包含某一文本的节点等。示例如下:

from pyquery import PyQuery as pq

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>
'''

doc = pq(html)
li = doc('li:first-child')  # 第1个 li 节点
print(li)
li = doc('li:last-child')   # 最后1个 li 节点
print(li)
li = doc('li:nth-child(2)')     # 第2个 li 节点
print(li)
li = doc('li:nth-child(2n)')    # 偶数位置 li 节点们
print(li)
li = doc('li:contains(second)')     # 文本包含second的节点
print(li)

        关于 CSS 选择器的更多用法,可以参考 CSS 教程

       文章到此结束,本人新手,若有错误,欢迎指正;若有疑问,欢迎讨论。若文章对你有用,点个小赞鼓励一下,谢谢大家,一起加油吧!

  • 30
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值