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

  1. $ sudo pip3 install pyquery

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

HTML 文件

在示例中,我们将使用以下 HTML 文件:

index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Header</title>
  5. <meta charset="utf-8">
  6. </head>
  7. <body>
  8. <h2>Operating systems</h2>
  9. <ul id="mylist" style="width:150px">
  10. <li>Solaris</li>
  11. <li>FreeBSD</li>
  12. <li>Debian</li>
  13. <li>NetBSD</li>
  14. <li>Windows</li>
  15. </ul>
  16. </body>
  17. </html>

简单的例子

在第一个示例中,我们使用 PyQuery 模块获取标头的文本。

header.py

  1. #!/usr/bin/python3
  2. from pyquery import PyQuery as pq
  3. with open("index.html", "r") as f:
  4. contents = f.read()
  5. doc = pq(contents)
  6. text = doc("h2").text()
  7. print(text)

该代码示例打印h2元素的文本。

  1. from pyquery import PyQuery as pq

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

  1. with open("index.html", "r") as f:
  2. contents = f.read()

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

  1. doc = pq(contents)

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

  1. text = doc("h2").text()

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

  1. $ ./header.py
  2. Operating systems

这是输出。

文本和 HTML 方法

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

get_list.py

  1. #!/usr/bin/python3
  2. from pyquery import PyQuery as pq
  3. with open("index.html", "r") as f:
  4. contents = f.read()
  5. doc = pq(contents)
  6. text = doc("ul").text()
  7. print("\n".join(text.split()))
  8. text = doc("ul").html()
  9. print("\n".join(text.split()))

我们获得ul元素的文本数据和 HTML 数据。

  1. $ ./get_list.py
  2. Solaris
  3. FreeBSD
  4. Debian
  5. NetBSD
  6. Windows
  7. <li>Solaris</li>
  8. <li>FreeBSD</li>
  9. <li>Debian</li>
  10. <li>NetBSD</li>
  11. <li>Windows</li>

这是输出。

属性

元素属性可以使用attr()方法检索。

attributes.py

  1. #!/usr/bin/python3
  2. from pyquery import PyQuery as pq
  3. with open("index.html", "r") as f:
  4. contents = f.read()
  5. doc = pq(contents)
  6. tag = doc("ul")
  7. print(tag.attr("id"))
  8. print(tag.attr("style"))

在代码示例中,我们检索并打印ul元素的两个属性:idstyle

  1. $ ./attributes.py
  2. mylist
  3. width:150px

这是输出。

网页抓取

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

scraping.py

  1. #!/usr/bin/python3
  2. from pyquery import PyQuery as pq
  3. import requests as req
  4. resp = req.get("http://www.something.com")
  5. doc = pq(resp.text)
  6. title = doc('title').text()
  7. print(title)

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

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

我们获取页面的 HTML 数据。

  1. title = doc('title').text()
  2. print(title)

我们检索其标题。

  1. $ ./scraping.py
  2. Something.

这是输出。

选择标签

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

selecting.py

  1. #!/usr/bin/python3
  2. from pyquery import PyQuery as pq
  3. def print_item(self, item):
  4. print("Tag: {0}, Text: {1}".format(item.tag, item.text))
  5. with open("index.html", "r") as f:
  6. contents = f.read()
  7. doc = pq(contents)
  8. first_li = doc("li:first")
  9. print(first_li.text())
  10. last_li = doc("li:last")
  11. print(last_li.text())
  12. odd_lis = doc("li:odd")
  13. odd_lis.each(print_item)

该示例从 HTML 文档中选择各种li标签。

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

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

  1. first_li = doc("li:first")
  2. print(first_li.text())

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

  1. last_li = doc("li:last")
  2. print(last_li.text())

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

  1. odd_lis = doc("li:odd")
  2. odd_lis.each(print_item)

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

  1. $ ./selecting.py
  2. Solaris
  3. Windows
  4. Tag: li, Text: FreeBSD
  5. Tag: li, Text: NetBSD

这是输出。

移除元素

remove()方法删除标签。

removing.py

  1. #!/usr/bin/python3
  2. from pyquery import PyQuery as pq
  3. with open("index.html", "r") as f:
  4. contents = f.read()
  5. doc = pq(contents)
  6. removed_item = doc('li:last').remove()
  7. print(removed_item)
  8. print(doc)

在示例中,我们删除了最后一个li标签。

  1. removed_item = doc('li:last').remove()

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

  1. print(removed_item)
  2. print(doc)

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

  1. $ ./removing.py
  2. <li>Windows</li>
  3. <html>
  4. <head>
  5. <title>Header</title>
  6. <meta charset="utf-8"/>
  7. </head>
  8. <body>
  9. <h2>Operating systems</h2>
  10. <ul id="mylist" style="width:150px">
  11. <li>Solaris</li>
  12. <li>FreeBSD</li>
  13. <li>Debian</li>
  14. <li>NetBSD</li>
  15. </ul>
  16. </body>
  17. </html>

这是输出。

items方法

items()方法允许迭代元素。

iterate.py

  1. #!/usr/bin/python3
  2. from pyquery import PyQuery as pq
  3. with open("index.html", "r") as f:
  4. contents = f.read()
  5. doc = pq(contents)
  6. items = [item.text() for item in doc.items('li')]
  7. print(items)

该示例迭代文档的li元素。

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

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

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

这是输出。

附加和前置元素

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

append_prepend.py

  1. #!/usr/bin/python3
  2. from pyquery import PyQuery as pq
  3. with open("index.html", "r") as f:
  4. contents = f.read()
  5. doc = pq(contents)
  6. mylist = doc("#mylist")
  7. mylist.prepend("<li>DragonFly</li>")
  8. mylist.append("<li>OpenBSD</li>")
  9. print(mylist)

该代码示例使用prepend()append()方法插入两个li元素。

filter方法

filter()方法用于过滤元素。

filtering.py

  1. #!/usr/bin/python3
  2. from pyquery import PyQuery as pq
  3. with open("index.html", "r") as f:
  4. contents = f.read()
  5. doc = pq(contents)
  6. filtered = doc('li').filter(lambda i: pq(this).text().startswith(('F', 'D', 'N')))
  7. print(filtered.text())

该示例显示了以FDN开头的操作系统。我们使用filter()方法和匿名函数。

  1. ./filtering.py
  2. FreeBSD Debian NetBSD

这是输出。

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

您可能也对以下相关教程感兴趣: jQuery 教程Beautifulsoup 教程Python 教程Python FTP 教程,Python 列表推导, OpenPyXL 教程Python Requests 教程Python CSV 教程