Pyquery教程展示了如何在Python中对XML文档进行jquery查询。Python教程是Python语言的综合教程。
jQuery
jQuery是一个用于操作DOM的JavaScript库。使用jQuery,我们可以查找、选择、遍历和操作HTML文档的各个部分。
查询
Pyquery是一个Python库,它具有与jQuery类似的API。它使用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是一个简单的PythonHTTP库。它提供了通过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方法允许迭代元素。
#!/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方法用于过滤元素。
#!/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
在本教程中,我们使用了Pythonpyquery库。
阅读Python教程或列出所有Python教程。
