文章目录
一. pyquery库简介
PyQuery库也是一个非常强大又灵活的网页解析库,前端基础较好的人,使用更加方便,上手快,且功能更强大。
二. 安装pyquery库
在 Ubuntu 虚拟机中,pyquery 能通过 pip 来安装:
$ python -m pip install pyquery
或者
$ pip install pyquery
其他平台下的安装可参考其他相应的安装方式,此处不做概述。
三. pyquery库详析
1. 初始化
像 Beautiful Soup
一样,初始化 pyquery
的时候,也需要传入 HTML
文本来初始化一个 PyQuery
对象。它的初始化方式有多种,比如直接传入字符串、传入 URL、传人文件名等。下面我们来详细介绍一下。
(1)字符串初始化
首先,我们来看一个实例:
from pyquery import PyQuery as pq
html = """
<div class="header">
<div class="header_contain">
<div class="logo"></div>
<ul class="menu">
<li><a href="../news/index.html">Home Page</a></li>
<li><a href="../course/course.html">Online Class</a></li>
<li><a href="../doc/docDownload.html">Download Document</a></li>
<li><a href="../news/search.html">Search</a></li>
</ul>
<div class="login">
<span class="span Admin"><a href="../user/admin.html"><strong>USER ADMIN:</strong></a></span>
<span class="item"><a href="../user/login.html">SIGN IN | </a></span>
<span class="item"><a href="../user/register.html">SIGN UP | </a></span>
<span class="item" id="logout" >SIGN OUT</span>
</div>
</div>
</div>
"""
doc = pq(html)
print(doc('li'))
代码运行结果如下:
<li><a href="../news/index.html">Home Page</a></li>
<li><a href="../course/course.html">Online Class</a></li>
<li><a href="../doc/docDownload.html">Download Document</a></li>
<li><a href="../news/search.html">Search</a></li>
这里我们首先引入 PyQuery 这个对象,命名为pq
。然后声明了一个 HTML 字符串,并将其当作参数传递给 PyQuery 类,这样就成功完成了初始化。接下来,将初始化的对象传入 CSS 选择器。在这个实例中,我们传入li
节点,这样就可以选择所有的li
节点。
(2)URL初始化
初始化的参数不仅可以以字符串的形式传递,还可以传入网页的URL,此时只需要指定参数为url即可:
from pyquery import PyQuery as pq
doc = pq(url='https://cuiqingcai.com/')
print(doc('title'))
# 运行结果:
<title>静觅丨崔庆才的个人站点</title>
这样的话,PyQuery 对象会首先请求这个 URL
,然后用得到的 HTML
内容完成初始化,这其实就相当于用网页的源代码以字符串的形式传递给PyQuery类来初始化。它与下面的功能是相同的:
from pyquery import PyQuery as pq
import requests
doc = pq(requests.get('https://cuiqingcai.com/').text)
print(doc('title'))
代码输出结果与前者相同。
(3)文件初始化
当然,除了传递URL,还可以传递本地的文件名,此时将参数指定为 filename
即可:
from pyquery import PyQuery as pq
doc = pq(filename='test.html')
print(doc ('li'))
当然,这里需要有一个本地 HTML 文件 test.html
,其内容是待解析的HTML字符串。这样它会首先读取本地的文件内容,然后用文件内容以字符串的形式传递给PyQuery类来初始化。
以上3种初始化方式均可,当然最常用的初始化方式还是以字符串形式传递。
2. 基本CSS选择器
首先,我们用一个实例来感受 pyquery 的 CSS 选择器的用法:
html = """
<div class="header">
<div class="header_contain">
<div class="logo"></div>
<ul class="menu">
<li><a href="../news/index.html">Home Page</a></li>
<li><a href="../course/course.html">Online Class</a></li>
<li><a href="../doc/docDownload.html">Download Document</a></li>
<li><a href="../news/search.html">Search</a></li>
</ul>
<div class="login">
<span class="span Admin"><a href="../user/admin.html"><span>USER ADMIN:</span></a></span>
<span class="item"><a href="../user/login.html">SIGN IN | </a></span>
<span class="item"><a href="../user/register.html">SIGN UP | </a></span>
<span class="item" id="logout" >SIGN OUT</span>
</div>
</div>
</div>
"""
html_query = pq(html)
print(html_query('.header_contain .menu li'))
print(type(html_query('.header_contain .menu li')))
代码运行结果如下:
<li><a href="../news/index.html">Home Page</a></li>
<li><a href="../course/course.html">Online Class</a></li>
<li><a href="../doc/docDownload.html">Download Document</a></li>
<li><a href="../news/search.html">Search</a></li>
<class 'pyquery.pyquery.PyQuery'>
这里我们初始化 PyQuery 对象之后,传入了一个CSS选择器,该选择器选取了所有的目标节点。打印其输出结果的类型,可以发现依然是 PyQuery 类型。
3. 查找节点
下面我们介绍一些常用的查询函数,这些函数和jQuery中函数的用法完全相同。
(1)子节点
查找子节点的函数有 find()
和 children()
。需要注意的是,find()
方法查找的节点包括该节点之后所有的子孙节点;而 children()
查找的是该节点的子节点,不包括孙节点。例如下面示例:
from pyquery import PyQuery as pq
html_query = pq(html)
items = html_query('.login')
print(type(items))
print(items)
spans = items.find('span')
print(type(spans))
print(spans)
spans = items.children()
print(type(spans))
print(spans)
上述代码运行结果如下:
<class 'pyquery.pyquery.PyQuery'>
<div class="login">
<span class="span Admin"><a href="../user/admin.html"><span>USER ADMIN:</span></a></span>
<span class="item"><a href="../user/login.html">SIGN IN | </a></span>
<span class="item"><a href="../user/register.html">SIGN UP | </a></span>
<span class="item" id="logout">SIGN OUT</span>
</div>
<class 'pyquery.pyquery.PyQuery'>
<span class="span Admin"><a href="../user/admin.html"><span>USER ADMIN:</span></a></span>
<span>USER ADMIN:</span><span class="item"><a href="../user/login.html">SIGN IN | </a><