Python pyquery 教程
Pyquery 教程 展示了如何在 Python 中对 XML 文档进行 jquery 查询。
jQuery
jQuery 是一个 JavaScript 库,用于处理 DOM。 使用 jQuery,我们可以查找,选择,遍历和操作 HTML 文档的各个部分。
pyquery
Pyquery 是一个 Python 库,具有与 jQuery 类似的 API。 它使用lxml
模块进行快速的 XML 和 HTML 操作。 该 API 尽可能类似于 jQuery。
安装 pyquery
使用以下命令安装 Pyquery:
| $ sudo pip3 install pyquery
|
我们使用pip3
命令安装pyquery
模块。
HTML 文件
在示例中,我们将使用以下 HTML 文件:
index.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 模块获取标头的文本。
header.py
| #!/usr/bin/python3
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()
方法读取其内容。
创建了PyQuery
对象; HTML 数据将传递给构造函数。
我们选择h2
标签,并使用text()
方法获取其文本。
| $ ./header.py
Operating systems
|
这是输出。
文本和 HTML 方法
text()
方法检索元素的文本,而html()
方法检索元素的 HTML 数据。
get_list.py
| #!/usr/bin/python3
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()
方法检索。
attributes.py
| #!/usr/bin/python3
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
|
这是输出。
网页抓取
请求是一个简单的 Python HTTP 库。 它提供了通过 HTTP 访问 Web 资源的方法。
scraping.py
| #!/usr/bin/python3
from pyquery import PyQuery as pq
import requests as req
resp = req.get("http://www.something.com")
doc = pq(resp.text)
title = doc('title').text()
print(title)
|
该示例检索一个简单网页的标题。
| resp = req.get("http://www.something.com")
doc = pq(resp.text)
|
我们获取页面的 HTML 数据。
| title = doc('title').text()
print(title)
|
我们检索其标题。
| $ ./scraping.py
Something.
|
这是输出。
选择标签
选择器用于选择 HTML 文档中满足某些条件的元素。 条件可以是它们的名称,ID,类名称,属性或它们的组合。
selecting.py
| #!/usr/bin/python3
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()
方法删除标签。
removing.py
| #!/usr/bin/python3
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()
方法允许迭代元素。
iterate.py
| #!/usr/bin/python3
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()
方法在节点的末尾添加元素。
append_prepend.py
| #!/usr/bin/python3
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()
方法用于过滤元素。
filtering.py
| #!/usr/bin/python3
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
|
这是输出。