Pyquery
最后修改于 2024 年 1 月 29 日
Pyquery 教程展示了如何在 Python 中对 XML 文档执行 jQuery 查询。
jQuery 是一个用于操作 DOM 的 JavaScript 库。使用 jQuery,我们可以查找、选择、遍历和操作 HTML 文档的各个部分。
Pyquery
Pyquery 是一个 Python 库,其 API 与 jQuery 类似。它使用 lxml
模块进行快速 XML 和 HTML 操作。API 尽可能地与 jQuery 相似。
安装 pyquery
Pyquery 的安装命令如下:
$ sudo pip3 install pyquery
我们使用 pip3
命令安装 pyquery
模块。
HTML 文件
在示例中,我们将使用以下 HTML 文件:
<!DOCTYPE html> <html> <head> <title>Header</title> <meta charset="utf-8"> </head> <body> <h2>Operating systems</h2> <ul id="mylist" style="width:150px"> <li>Solaris</li> <li>FreeBSD</li> <li>Debian</li> <li>NetBSD</li> <li>Windows</li> </ul> </body> </html>
简单示例
在第一个示例中,我们使用 pyquery 模块获取标题的文本。
#!/usr/bin/python from pyquery import PyQuery as pq with open("index.html", "r") as f: contents = f.read() doc = pq(contents) text = doc("h2").text() print(text)
代码示例打印 h2
元素中的文本。
from pyquery import PyQuery as pq
我们从 pyquery
模块导入 PyQuery
类。PyQuery
是进行工作的核心类。
with open("index.html", "r") as f: contents = f.read()
我们打开 index.html
文件并使用 read
方法读取其内容。
doc = pq(contents)
创建一个 PyQuery
对象;HTML 数据被传递给构造函数。
text = doc("h2").text()
我们选择 h2
标签并使用 text
方法获取其文本。
$ ./header.py Operating systems
text 和 html 方法
text
方法检索元素的文本,而 html
方法检索元素的 HTML 数据。
#!/usr/bin/python from pyquery import PyQuery as pq with open("index.html", "r") as f: contents = f.read() doc = pq(contents) text = doc("ul").text() print("\n".join(text.split())) text = doc("ul").html() print("\n".join(text.split()))
我们获取 ul
元素的文本数据和 HTML 数据。
$ ./get_list.py Solaris FreeBSD Debian NetBSD Windows <li>Solaris</li> <li>FreeBSD</li> <li>Debian</li> <li>NetBSD</li> <li>Windows</li>
属性
可以使用 attr
方法检索元素属性。
#!/usr/bin/python from pyquery import PyQuery as pq with open("index.html", "r") as f: contents = f.read() doc = pq(contents) tag = doc("ul") print(tag.attr("id")) print(tag.attr("style"))
在代码示例中,我们检索并打印 ul
元素的两个属性:id
和 style
。
$ ./attributes.py mylist width:150px
网络抓取
Requests 是一个简单的 Python HTTP 库。它提供了通过 HTTP 访问 Web 资源的方法。
#!/usr/bin/python from pyquery import PyQuery as pq import requests as req resp = req.get("http://www.webcode.me") doc = pq(resp.text) title = doc('title').text() print(title)
该示例检索一个简单网页的标题。
resp = req.get("http://www.webcode.me") doc = pq(resp.text)
我们获取页面的 HTML 数据。
title = doc('title').text() print(title)
我们检索其标题。
$ ./scraping.py My html page
选择标签
选择器用于选择 HTML 文档中满足特定标准的元素。标准可以是它们的名称、ID、类名、属性或它们的组合。
#!/usr/bin/python from pyquery import PyQuery as pq def print_item(self, item): print("Tag: {0}, Text: {1}".format(item.tag, item.text)) with open("index.html", "r") as f: contents = f.read() doc = pq(contents) first_li = doc("li:first") print(first_li.text()) last_li = doc("li:last") print(last_li.text()) odd_lis = doc("li:odd") odd_lis.each(print_item)
该示例从 HTML 文档中选择各种 li
标签。
def print_item(self, item): print("Tag: {0}, Text: {1}".format(item.tag, item.text))
在此函数中,我们打印标签名称及其文本。
first_li = doc("li:first") print(first_li.text())
我们选择第一个 li
标签并使用 text
方法打印其内容。
last_li = doc("li:last") print(last_li.text())
这里我们获取最后一个 li
标签。
odd_lis = doc("li:odd") odd_lis.each(print_item)
借助 each
方法,我们使用一个匿名函数打印奇数 li
元素的标签及其内容。
$ ./selecting.py Solaris Windows Tag: li, Text: FreeBSD Tag: li, Text: NetBSD
删除元素
remove
方法会删除一个标签。
#!/usr/bin/python from pyquery import PyQuery as pq with open("index.html", "r") as f: contents = f.read() doc = pq(contents) removed_item = doc('li:last').remove() print(removed_item) print(doc)
在示例中,我们删除了最后一个 li
标签。
removed_item = doc('li:last').remove()
我们选择最后一个 li
标签并使用 remove
方法将其删除。被删除的元素将被返回。
print(removed_item) print(doc)
我们打印被删除的项和已删除元素的文档。
$ ./removing.py <li>Windows</li> <html> <head> <title>Header</title> <meta charset="utf-8"/> </head> <body> <h2>Operating systems</h2> <ul id="mylist" style="width:150px"> <li>Solaris</li> <li>FreeBSD</li> <li>Debian</li> <li>NetBSD</li> </ul> </body> </html>
items 方法
items
方法允许迭代元素。
#!/usr/bin/python from pyquery import PyQuery as pq with open("index.html", "r") as f: contents = f.read() doc = pq(contents) items = [item.text() for item in doc.items('li')] print(items)
该示例迭代文档的 li
元素。
items = [item.text() for item in doc.items('li')]
items
方法用于在列表推导式中创建一个 li
元素的 Python 列表。
$ ./iterate.py ['Solaris', 'FreeBSD', 'Debian', 'NetBSD', 'Windows']
追加和前置元素
append
方法在节点末尾添加一个元素,而 prepend
方法将元素插入到节点的开头。
#!/usr/bin/python from pyquery import PyQuery as pq with open("index.html", "r") as f: contents = f.read() doc = pq(contents) mylist = doc("#mylist") mylist.prepend("<li>DragonFly</li>") mylist.append("<li>OpenBSD</li>") print(mylist)
代码示例使用 prepend
和 append
方法插入两个 li
元素。
filter 方法
filter
方法用于过滤元素。
#!/usr/bin/python from pyquery import PyQuery as pq with open("index.html", "r") as f: contents = f.read() doc = pq(contents) filtered = doc('li').filter(lambda i: pq(this).text().startswith(('F', 'D', 'N'))) print(filtered.text())
该示例显示以 F、D 或 N 开头的操作系统。我们使用 filter
方法和一个匿名函数。
$ ./filtering.py FreeBSD Debian NetBSD
来源
在本文中,我们使用了 Python pyquery 库。
作者
列出所有 Python 教程。