跳转至

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是从事工作的主要班级。

1
2
3
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

这是输出。

文本和 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元素的两个属性:idstyle

1
2
3
$ ./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标签。

1
2
3
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元素的标签及其内容。

1
2
3
4
5
$ ./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

这是输出。