ZetCode

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 文件:

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/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 数据。

get_list.py
#!/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 方法检索元素属性。

attributes.py
#!/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 元素的两个属性:idstyle

$ ./attributes.py 
mylist
width:150px

网络抓取

Requests 是一个简单的 Python HTTP 库。它提供了通过 HTTP 访问 Web 资源的方法。

scraping.py
#!/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、类名、属性或它们的组合。

selecting.py
#!/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 方法会删除一个标签。

removing.py
#!/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 方法允许迭代元素。

iterate.py
#!/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 方法将元素插入到节点的开头。

append_prepend.py
#!/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)

代码示例使用 prependappend 方法插入两个 li 元素。

filter 方法

filter 方法用于过滤元素。

filtering.py
#!/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 pyquery 库。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程