- 订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+
python项目实战
Python编程基础教程系列(零基础小白搬砖逆袭)
- 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费专栏,可报销(名额有限,先到先得)。
- 作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度博客新星top100入围,荣获多家平台专家称号。
〖Python网络爬虫实战⑭〗- BeautifulSoup详讲
在上一节中,我们介绍了 Beautiful Soup 的用法,它是一个非常强大的网页解析库,你是否觉得它的一些方法用起来有点不适应?有没有觉得它的 CSS 选择器的功能没有那么强大?
如果你对 Web 有所涉及,如果你比较喜欢用 CSS 选择器,如果你对 jQuery 有所了解,那么这里有一个更适合你的解析库 ——pyquery。
接下来,我们就来感受一下 pyquery 的强大之处。
pip install pyquery
像 Beautiful Soup 一样,初始化 pyquery 的时候,也需要传入 HTML 文本来初始化一个 PyQuery 对象。它的初始化方式有多种,比如直接传入字符串,传入 URL,传入文件名,等等。下面我们来详细介绍一下。
我们在这里介绍四种初始化方式。
from pyquery import PyQuery as pq
doc = pq("")
pq 参数可以直接传入 HTML 代码,doc 现在就相当于 jQuery 里面的 $ 符号了。
from lxml import etree
doc = pq(etree.fromstring(""))
可以首先用 lxml 的 etree 处理一下代码,这样如果你的 HTML 代码出现一些不完整或者疏漏,都会自动转化为完整清晰结构的 HTML 代码。
from pyquery import PyQuery as pq
doc = pq('http://www.baidu.com')
这里就像直接请求了一个网页一样,类似用 urllib2 来直接请求这个链接,得到 HTML 代码。
from pyquery import PyQuery as pq
doc = pq(filename='hello.html')
可以直接传某个路径的文件名。
我们首先用一个实例来感受一下 pyquery 的 CSS 选择器的用法:
html = '''
- first item
- second item
- third item
- fourth item
- fifth item
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))
这里我们初始化 PyQuery 对象之后,传入了一个 CSS 选择器 #container .list li,它的意思是先选取 id 为 container 的节点,然后再选取其内部的 class 为 list 的节点内部的所有 li 节点。然后,打印输出。可以看到,我们成功获取到了符合条件的节点。
最后,将它的类型打印输出。可以看到,它的类型依然是 PyQuery 类型。
节点和前面的都差不多,这里就不多解释。
提取到节点之后,我们的最终目的当然是提取节点所包含的信息了。比较重要的信息有两类,一是获取属性,二是获取文本,下面分别进行说明。
提取到某个 PyQuery 类型的节点后,就可以调用 attr() 方法来获取属性:
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a, type(a))
print(a.attr('href'))
这段代码首先导入了 PyQuery
模块,然后使用 pq()
函数将 HTML 代码解析为 doc
对象。接着,我们使用 doc()
方法查找具有特定类名或ID的元素,并使用 a
属性获取该元素的引用。最后,我们打印了 a
和 type(a)
的值,以验证 a
是否为 元素,以及
type(a)
是否为
元素。
获取节点之后的另一个主要操作就是获取其内部的文本了,此时可以调用 text 方法来实现:
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())
这段代码首先导入了 PyQuery
模块,然后使用 pq()
函数将 HTML 代码解析为 doc
对象。接着,我们使用 doc()
方法查找具有特定类名或ID的元素,并使用 a
属性获取该元素的引用。最后,我们打印了 a
的值和 a.text()
的值,以验证 a
是否为 元素,以及
a.text()
是否为 first item
元素的文本内容。
PyQuery 是 Python 仿照 jQuery 的严格实现。语法与 jQuery 几乎完全相同,所以不用再去费心去记一些奇怪的方法了。