pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析 HTML 文档,易用性和解析速度都很好
PyQuery是一个类似于jQuery的解析网页工具,使用lxml操作xml和html文档,它的语法和jQuery很像。和XPATH,Beautiful Soup比起来,PyQuery更加灵活,提供增加节点的class信息,移除某个节点,提取文本信息等功能
PyQuery是强大而又灵活的网页解析库,如果你觉得正则写起来太麻烦,如果你觉得BeautifulSoup语法太难记,如果你熟悉jQuery的语法,如果你觉得xpath用法单一。那么,PyQuery就是你绝佳的选择
pip install pyquery
from pyquery import PyQuery as pq
初始化PyQuery对象
html =
"""
<div>
<ul>
<li class="item" data-index="0"> first </li>
<li class="item" data-index="1"> second </li>
<li class="item" data-index="2"> third </li>
</ul>
</div>
"""
doc = pq(html)
headers = {
'User-Agent': "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 96.0.4664 .93 Safari / 537.36",
}
doc = pq(url="http://www.baidu.com", headers=headers) # 其会自动请求这个链接
doc = pq(filename="./demo.html")
css 选择器在 W3C 里面有,下面列举部分常用的选择器
名称 | 用法 | 描述 |
---|---|---|
ID 选择器 | doc("#id") | 获取指定 ID 的元素 |
全选选择器 | doc("*") | 匹配所有元素 |
类选择器 | doc(".class") | 获取同一类 class 的元素 |
标签选择器 | doc(“div”) | 获取同一标签所有元素 |
并集选择器 | doc(“div, p, li”) | 选取多个元素 |
交集选择器 | doc(“li.current”) | 交集选择器 |
子代选择器 | doc(“ul>li”) | 使用 > 号,获取亲儿子层级的元素 |
后代选择器 | doc(“ul li”) | 使用空格,代表后代选择器,包括孙子等 |
还有 [element=value] :得到特定属性值的元素
语法 | 用法 | 说明 |
---|---|---|
parent() | doc(“li”).parent() | 查找父级 |
children(selector) | doc(“ul”).children(“li”) | 查找最近一级(亲儿子)子代选择器 |
find(selector) | doc(“ol”).find(“li”) | 相当于后代选择器 |
siblings(selector) | doc(".first").siblings(“li”) | 查找兄弟节点,不包括自己本身 |
next_all([expr]) | doc(".first").next_all() | 查找当前元素之后所有的同辈元素 |
prevt_all([expr]) | doc(".last").prevt_all() | 查找当前元素之前所有的同级元素 |
has_class(className) | doc(“div”).has_class(“protected”) | 检查当前元素是否有某个特定的类 |
eq(index) | doc(“li”).eq(2) | 获取到的 li 元素中,选择索引号为 2 的元素,索引号从 0 开始 |
注意:
- next_all:其得到的值为 xpath_Element 对象,可以通过 xpath 解析出来
parents(“选择器”):选择符合条件的祖先元素
语法 | 用法 | 描述 |
---|---|---|
:first | doc(“li:first”); | 获取第一个 li 元素 |
:last | doc(“li:last”); | 获取最后一个 li 元素 |
:eq(index) | doc(“li:eq(2)”); | 获取到的 li 元素中,选择索引号为 2 的元素,索引号从 0 开始 |
:odd | doc(“li:odd”); | 获取到的 li 元素中,选择索引号为奇数的元素 |
:even | doc(“li:even”); | 获取到的 li 元素中,选择索引号为偶数的元素 |
那要取多个li节点的属性值,要怎么做呢?这就要结合 items 方法来实现。items()方法是返回的节点的生成器generator object PyQuery.items
li = pq(html)('li')
print(li.items()) # items 获取
for item in li.items():
print(item)
语法:
doc('div').attr("id") # 如果有两个值,其为修改样式
直接使用 css 方法修改元素的样式
doc("div").css(
# 内部存放字典
)
作用等同于 classList,可以操作样式,注意操作类里面的参数不要加点
添加类
doc("div").add_class("current"); # 注意不要添加 .
删除类
doc("div").remove_class("current"); # 注意不要添加 .
切换类
doc("div").toggle_class("current"); # 如果没有这个类就添加,有就删除这个类
attr 方法获取
doc('div').attr("id")
text 方法获取
doc("div").text()
如果多个节点有值,获取所有节点的文本,中间使用空格分隔
html 方法获取
doc("div").html()
通过观察 PyQuery 库的部分语法,我们发现其使用方法与 jQuery 的语法高度相似
可以通过学习 jQuery 语法来加快理解 PyQuery