在 Python 爬虫圈,解析 HTML 一直是个体力活。正则表达式太硬核,XPath 记忆成本又高。
而 PyQuery 的出现,让你可以用优雅的 jQuery 语法,轻松从网页里提取想要的数据。
🔍 快速上手:加载文档
开始前先安装:pip install pyquery。搞定后,加载 HTML 的方式非常灵活,可以从字符串、文件甚至直接传入 URL。
下面这段代码演示了三种最常见的初始化方式。第一种直接解析字符串,第二种读取本地文件,第三种直接传入网址,PyQuery 会自动发起请求并解析,一步到位。
from pyquery import PyQuery as pq
# 方式一:从字符串加载
doc = pq("<html><body><h1>Hello</h1></body></html>")
# 方式二:从文件加载
doc = pq(filename="index.html")
# 方式三:直接加载URL
doc = pq(url="https://example.com")
print(doc("h1").text())
执行上面代码,终端会输出:
Hello
🎯 精准定位:CSS 选择器
PyQuery 的灵魂就是 CSS 选择器,这让你几乎零学习成本。类选择器、ID 选择器、属性选择器,写法和你写前端样式完全一样。
代码逻辑很直观:先用类选择器锁定父容器,再通过后代选择器找出所有 a 标签,最后遍历打印。
html = '''
<ul class="nav">
<li>首页</li>
<li>博客</li>
</ul>'''
doc = pq(html)
for link in doc(".nav a").items():
print(link.text(), link.attr("href"))
执行上面代码,终端会输出:
首页 /home
博客 /blog
🚀 数据清洗:链式操作
PyQuery 支持链式调用,一个表达式就能完成查找、过滤、取值,读起来像流水线一样顺畅。这在清洗杂乱数据时特别省事。
先选中所有 p 标签,用 filter 方法按文本内容筛选,最后取 text。
html = "<div><p>普通信息</p ><p>重要通知</p ><p>普通公告</p ></div>"
doc = pq(html)
result = doc("p").filter(lambda i, e: "重要"in pq(e).text()).text()
print(result)
执行上面代码,终端会输出:
重要通知
⚡ 属性操作:增删改查
不光能读取,PyQuery 还能直接修改元素,这在数据预处理阶段非常实用。
这段代码展示了三步操作:先用 find 找到图片标签,接着用 remove_attr 去掉 style 属性,最后给图片统一加上 loading="lazy" 属性以便延迟加载,输出修改后的结构。
html = '<div>< img src="1.jpg" style="width:100px"/></div>'
doc = pq(html)
doc.find("img").remove_attr("style").attr("loading", "lazy")
print(doc.html())
执行上面代码,终端会输出:
< img src="1.jpg" loading="lazy"/>
📊 优势与不足:为什么选它
相比 BeautifulSoup 的臃肿,PyQuery 语法更紧凑;对比正则表达式的脆弱,它解析结构化数据更稳健。
💬 写在最后
如果你厌倦了繁琐的 XPath 语法,不妨试试用 jQuery 的方式写爬虫。你在用什么解析库?遇到过哪些坑?欢迎来评论区聊聊,我会一一回复。