# PyQuery 教程

> 原文： [http://zetcode.com/python/pyquery/](http://zetcode.com/python/pyquery/)

PyQuery 教程展示了如何在 Python 中对 XML 文档进行 jQuery 查询。

## jQuery

jQuery 是一个 JavaScript 库，用于处理 DOM。 使用 jQuery，我们可以查找，选择，遍历和操作 HTML 文档的各个部分。

## PyQuery

PyQuery 是一个 Python 库，具有与 jQuery 类似的 API。 它使用`lxml`模块进行快速的 XML 和 HTML 操作。 该 API 尽可能类似于 jQuery。

## 安装 PyQuery

使用以下命令安装 PyQuery：

```py
$ sudo pip3 install pyquery

```

我们使用`pip3`命令安装 PyQuery 模块。

## HTML 文件

在示例中，我们将使用以下 HTML 文件：

`index.html`

```py
<!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`

```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`元素的文本。

```py
from pyquery import PyQuery as pq

```

我们从`pyquery`模块导入`PyQuery`类。 `PyQuery`是从事工作的主要类。

```py
with open("index.html", "r") as f:

    contents = f.read()

```

我们打开`index.html`文件并使用`read()`方法读取其内容。

```py
doc = pq(contents)

```

创建了`PyQuery`对象； HTML 数据将传递给构造器。

```py
text = doc("h2").text()

```

我们选择`h2`标签，并使用`text()`方法获取其文本。

```py
$ ./header.py 
Operating systems

```

这是输出。

## 文本和 HTML 方法

`text()`方法检索元素的文本，而`html()`方法检索元素的 HTML 数据。

`get_list.py`

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

```py
$ ./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`

```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`。

```py
$ ./attributes.py 
mylist
width:150px

```

这是输出。

## 网页抓取

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

`scraping.py`

```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)

```

该示例检索一个简单网页的标题。

```py
resp = req.get("http://www.something.com")
doc = pq(resp.text)

```

我们获取页面的 HTML 数据。

```py
title = doc('title').text()
print(title)

```

我们检索其标题。

```py
$ ./scraping.py 
Something.

```

这是输出。

## 选择标签

选择器用于选择 HTML 文档中满足某些条件的元素。 条件可以是它们的名称，ID，类名称，属性或它们的组合。

`selecting.py`

```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`标签。

```py
def print_item(self, item):

    print("Tag: {0}, Text: {1}".format(item.tag, item.text))

```

在此函数中，我们打印标签名称及其文本。

```py
first_li = doc("li:first")
print(first_li.text())

```

我们选择第一个`li`标签，并使用`text()`方法打印其内容。

```py
last_li = doc("li:last")
print(last_li.text())

```

在这里，我们得到了最后的`li`标签。

```py
odd_lis = doc("li:odd")    
odd_lis.each(print_item)

```

借助`each()`方法，我们将打印每个奇数`li`元素的标签及其内容。

```py
$ ./selecting.py 
Solaris
Windows
Tag: li, Text: FreeBSD
Tag: li, Text: NetBSD

```

这是输出。

## 移除元素

`remove()`方法删除标签。

`removing.py`

```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`标签。

```py
removed_item = doc('li:last').remove()

```

我们选择最后一个`li`标签，然后用`remove()`删除它。 返回删除的元素。

```py
print(removed_item)
print(doc)

```

我们将打印已删除的项目和已删除元素的文档。

```py
$ ./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`

```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`元素。

```py
items = [item.text() for item in doc.items('li')]

```

`items()`方法用于在列表推导式中创建`li`元素的 Python 列表。

```py
$ ./iterate.py 
['Solaris', 'FreeBSD', 'Debian', 'NetBSD', 'Windows']

```

这是输出。

## 附加和前置元素

`append()`方法在节点的末尾添加元素，`prepend()`方法在节点的末尾添加元素。

`append_prepend.py`

```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`

```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()`方法和匿名函数。

```py
 ./filtering.py 
FreeBSD Debian NetBSD

```

这是输出。

在本教程中，我们使用了 python PyQuery 库。

您可能也对以下相关教程感兴趣： [jQuery 教程](/web/jquery)， [Beautifulsoup 教程](/python/beautifulsoup)， [Python 教程](/lang/python/)， [Python FTP 教程](/python/ftp/)，Python 列表推导， [OpenPyXL 教程](/articles/openpyxl/)， [Python Requests 教程](/web/pythonrequests/)和 [Python CSV 教程](/python/csv/)。