领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

一文带你了解PyQuery解析器(python文本解析器)

nixiaole 2025-06-15 18:29:52 知识剖析 4 ℃

从本质上看, PyQuery 与知名的Beautiful Soup同样具备解析HTML文档的卓越能力。值得关注的是,鉴于 PyQuery是基于业界领先的lxml库构建而成,其在实际应用环境下的表现速度要高于Beautiful Soup。值得重点关注的,PyQuery仅支持CSS这一种样式选择器,基于这种精益求精的设计理念,使得其在功能方面相较于Beautiful Soup展现出了明显优势,使得诸如基础内容抓取等操作过程更加简便实用。如果您对CSS选择器有着深刻理解或者对于该技术有着特别的偏好,那么无疑,PyQuery将会成为您最佳的选择。

pyquery: a jquery-like library for python, 官网对 PyQuery 的介绍,像JQuery一样的Python库。

开始使用

PyQuery 是第三方库,因此在使用之前需要安装该库。

pip install pyquery

安装好后,就可以使用了,以下为获取百度标题的示例:

from pyquery import PyQuery as pq
doc = pq(url="http://www.baidu.com")
print(doc('title').text())

# 	百度一下,你就知道

在上边的代码中,直接将网址作为参数传递给 PyQuery 对象,接着从获取到的对象中,获取 title 标签,并调用 text 方法获取其文本值。

上边的案例中,我们使用了 URL 参数初始化 PyQuery,其构造方法还提供了使用字符串文件初始化的功能,可以根据实际情况选择使用。

from pyquery import PyQuery as pq

#----字符串初始化-----
html = """<span>第一个标签</span>"""
doc = pq(html)
print(doc('span').text())

#----文件初始化-----
doc = pq(filename='./test.html')
print(doc('span').text())

获取文本和 HTML

在 PyQuery 中,使用 text()方法检索元素文本,并可以使用 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>
# 获取文本
text = doc("ul").text()
print("\n".join(text.split()))
# Solaris
# FreeBSD
# Debian
# NetBSD
# Windows

# 获取html元素
text = doc("ul").html()
print("\n".join(text.split())) 
# <li>Solaris</li>
# <li>FreeBSD</li>
# <li>Debian</li>
# <li>NetBSD</li>
# <li>Windows</li>

获取属性

通过使用 attr()方法获取属性值内容

# 现获取元素对象
tag = doc("ul")

# 再获取元素属性
print(tag.attr("id"))
print(tag.attr("style")) 

# mylist
# width:150px

标签选择

使用选择器可以方便的从 html 文档中选择需要的标签,可以是标签的名字,也可以是 clss,id 或其他属性。熟悉前端框架 jQuery 或者 css 的就会非常容易上手。

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

# 选择li的第一个元素
first_li = doc("li:first")
# 选择li的最后一个元素
last_li = doc("li:last")
# 获取技术li
odd_lis = doc("li:odd")  
# 借助each方法遍历所有元素
odd_lis.each(print_item)

# Solaris
# Windows
# Tag: li, Text: FreeBSD
# Tag: li, Text: NetBSD

更多的方法

items()方法,通过此方法获取可迭代元素集合。

# 将li元素内容放到list中 
items = [item.text() for item in doc.items('li')]

filter()方法,通过此方法可以过滤元素,方法接受一个函数,用于判断过滤条件。

# 获取li标签中以F,D,N开头的元素内容
doc('li').filter(lambda i: pq(this).text().startswith(('F', 'D', 'N')))

PyQuery 还提供了对 html 文档编辑的功能,我们在爬虫的时候很少会主动去删除或添加节点,这里就不做过多的说明,以下是一些简单的案例:

# 删除li最后一个元素
doc('li:last').remove()

# 获取clss为mylist的节点
mylist = doc("#mylist")
# 在节点前添加一个节点
mylist.prepend("<li>DragonFly</li>")
# 在节点后添加一个节点元素
mylist.append("<li>OpenBSD</li>")
# 给节点添加class
mylist.addClass("test")
# 删除节点class
mylist.removeClass("test")
最近发表
标签列表