一文带你了解PyQuery解析器
从本质上看, PyQuery 与知名的Beautiful Soup同样具备解析HTML文档的卓越能力。值得关注的是,鉴于 PyQuery是基于业界领先的lxml库构建而成,其在实际应用环境下的表现速度要高于Beautiful Soup。值得重点关注的,PyQuery仅支持CSS这一种样式选择器,基于这种精益求精的设计理念,使得其在功能方面相较于Beautiful Soup展现出了明显优势,使得诸如基础内容抓取等操作过程更加简便实用。如果您对CSS选择器有着深刻理解或者对于该技术有着特别的偏好,那么无疑,PyQuery将会成为您最佳的选择。
pyquery: a jquery-like library for python, 官网对 PyQuery 的介绍,像JQuery一样的Python库。
PyQuery
开始使用
PyQuery 是第三方库,因此在使用之前需要安装该库。
pip install pyquery
安装好后,就可以使用了,以下为获取百度标题的示例:
from pyquery import PyQuery as pq
doc = pq(url="http://www.baidu.com")
print(doc('title').text())
# 百度一下,你就知道
在上边的代码中,直接将网址作为参数传递给 PyQuery 对象,接着从获取到的对象中,获取 title 标签,并调用 text 方法获取其文本值。
上边的案例中,我们使用了 URL 参数初始化 PyQuery,其构造方法还提供了使用字符串或文件初始化的功能,可以根据实际情况选择使用。
from pyquery import PyQuery as pq
#----字符串初始化-----
html = """第一个标签"""
doc = pq(html)
print(doc('span').text())
#----文件初始化-----
doc = pq(filename='./test.html')
print(doc('span').text())
获取文本和 HTML
在 PyQuery 中,使用 text()方法检索元素文本,并可以使用 html()方法获取元素的 HTML 数据。
Header
Operating systems
- Solaris
- FreeBSD
- Debian
- NetBSD
- Windows
# 获取文本
text = doc("ul").text()
print("\n".join(text.split()))
# Solaris
# FreeBSD
# Debian
# NetBSD
# Windows
# 获取html元素
text = doc("ul").html()
print("\n".join(text.split()))
# Solaris
# FreeBSD
# Debian
# NetBSD
# Windows
获取属性
通过使用 attr()方法获取属性值内容
# 现获取元素对象
tag = doc("ul")
# 再获取元素属性
print(tag.attr("id"))
print(tag.attr("style"))
# mylist
# width:150px
标签选择
使用选择器可以方便的从 html 文档中选择需要的标签,可以是标签的名字,也可以是 clss,id 或其他属性。熟悉前端框架 jQuery 或者 css 的就会非常容易上手。
def print_item(self, item):
print("Tag: {0}, Text: {1}".format(item.tag, item.text))
# 选择li的第一个元素
first_li = doc("li:first")
# 选择li的最后一个元素
last_li = doc("li:last")
# 获取技术li
odd_lis = doc("li:odd")
# 借助each方法遍历所有元素
odd_lis.each(print_item)
# Solaris
# Windows
# Tag: li, Text: FreeBSD
# Tag: li, Text: NetBSD
更多的方法
items()方法,通过此方法获取可迭代元素集合。
# 将li元素内容放到list中
items = [item.text() for item in doc.items('li')]
filter()方法,通过此方法可以过滤元素,方法接受一个函数,用于判断过滤条件。
# 获取li标签中以F,D,N开头的元素内容
doc('li').filter(lambda i: pq(this).text().startswith(('F', 'D', 'N')))
PyQuery 还提供了对 html 文档编辑的功能,我们在爬虫的时候很少会主动去删除或添加节点,这里就不做过多的说明,以下是一些简单的案例:
# 删除li最后一个元素
doc('li:last').remove()
# 获取clss为mylist的节点
mylist = doc("#mylist")
# 在节点前添加一个节点
mylist.prepend("DragonFly ")
# 在节点后添加一个节点元素
mylist.append("OpenBSD ")
# 给节点添加class
mylist.addClass("test")
# 删除节点class
mylist.removeClass("test")