pyQuery:一个使用jquery语法超简单的html解析库

在使用python爬取网页时,一个好的html解析库将事半功倍,通常用的比较多的有 Beautiful Soup

Beautiful Soup提供一些简单的函数用来处理导航、搜索、修改分析树等功能。 它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

功能强大、性能不错,而且对损坏的html也能有较高的容忍度。

不过今天要说的是另一个库pyQuery :这是是一个风格类似于jQuery的html解析库,就像名字所暗示的,在获取html元素和提取数据时,风格几乎和jQuery一模一样。

比如,要获取所有a元素,pq('a') pq(".link a"), 如果熟悉jquery的话,用起来得心应手超级简单,相比beautiful 更简单,支持链式调用,代码量更少。

不同点 BeautifulSoup PyQuery
语法和API 简单直观 jQuery风格
CSS 选择器/XPath CSS选择器为主 CSS选择器和XPath
社区 活跃庞大的社区 较小

安装pyQuery

就和安装其他pip库一样,pip install pyquery,一行代码完成安装

代码中导入即可使用 import pyquery

装载 html 创建pyquery对象

通过requests或其他http请求库获取到html文本,构建一个pyquery对象,即可检索提取其中的元素和数据。

doc=pyquery("html文本")

当然也可以直接传入url地址,由pyquery抓取网页

doc=pyquery("http:xxxx")

或者传递一个本地html文件路径

doc=pyquery(filename="xxx/xx.html")

获取元素:css选择器语法

doc是一个pyquery对象,可使用几乎绝大多数jquery选择器语法来获取某个或某些元素

scss 复制代码
doc("a")   
doc(".link")   
doc("#user .link")   
doc("[data-name]") 
doc('.product[attributeName^="product"]')
doc(".mybook > .column")

获取元素:使用find()方法

就像jquery中 find(".link"),在pyquery中,也可以使用find方法寻找元素,包括链式调用

doc(".product_list").find(".meta-info")

获取和设置元素信息

获取到元素后,可以调用对应方法设置或获取需要的信息

  • text(): 获取或设置元素文本

比如获取id为user的a标签的文本内容,使用jquery怎么获取,pyquery也是怎么获取

doc('#a').text()

  • attr():获取或设置元素属性

获取这个元素的href属性 doc('#a').attr('href')

一如 jquery,text() 用于获取或设置元素的文本内容,attr()用于获取或设置属性

  • html(): 获取或设置元素的html内容

doc('#a').html("<strong>hello</strong>")

  • addClass()/removeClass: 给元素添加或异常类

doc("#a").addClass("name")

  • css(): 获取或设置元素的css doc("#a").css("font-size", "15px")

  • remove(): 移除不需要的元素

doc("head").remove() 直接删掉用不到的元素,更方便提取数据

还有哪些方法? 通常常用的jquery操作元素的方法,在pyquery里可直接使用。

hide()/width()/height()/eq()/next()/prev()/children()/append()/prepend()/after()/before()/val()

具体可查看官方文档 pythonhosted.org/pyquery/api...

获取多个元素

就像 $("a") 获取文档中所有的a标签一样,doc("a") 也是获取到所有a元素,调用它的 items() 方法,返回所有这些a元素的list,

scss 复制代码
for it in doc("a").items():
    print(it.attr('href'))
    

items() 中的每个元素都是一个pyquery对象,可以继续使用选择器获取子元素或直接获取属性。

注意事项

默认情况下,pyquery 使用 lxml的xml 解析器,如果失败,则继续尝试 lxml.html 中的 html 解析器。 不过可以显式选择要使用的解析器:

css 复制代码
pq('<html><body><p>toto</p></body></html>', parser='xml')

pq('<html><body><p>toto</p></body></html>', parser='html')

pq('<html><body><p>toto</p></body></html>', parser='html_fragments')

为什么要选pyquery呢?

简单、灵活、链式调用,写更少的代码,是我使用它的主要原因。

  • 简洁而熟悉的语法: 如果已经熟悉了 jQuery,那么使用 PyQuery 如鱼得水。
  • 高效强大的解析功能: 底层使用 lxml 库,这个库以解析 HTML 和 XML 文档的速度和效率著称
  • 灵活的数据提取: 可以灵活地使用 CSS 选择器、XPath 表达式甚至正则表达式提取数据。

官方文档

pythonhosted.org/pyquery/ind...

相关推荐
刘马想放假20 分钟前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
2601_967987371 小时前
python判断变量名不要调用任何函数实现
python·函数·语法·判断·变量名
卷无止境2 小时前
SALib敏感性分析的python库学习笔记
后端·python
duansamve3 小时前
Python3+Flask+PostgreSQL18+Vue3项目生产环境用docker如何部署?
python·docker·flask
特立独行的猫A3 小时前
少 3 个环节、少 1 次 ABI、少 3500 行代码:cj-tauri 与 Ionic/Capacitor 的鸿蒙桥接机制对比
java·后端·python
特立独行的猫A4 小时前
cj-tauri vs Rust/Tauri 同款播放器实测:编译 21 秒 vs 11 分钟,磁盘 12 MB vs 1.2 GB
java·后端·python
duansamve4 小时前
详解Flask中Session和Cookie
python·flask
威哥爱编程5 小时前
模拟面试智能体开发实战 04:面试聊到哪算哪?用状态机把整场面试编排起来
python·agent·harmonyos
威哥爱编程5 小时前
模拟面试智能体开发实战 03:AI 面试官太客气?人设 Prompt 让它像个真考官
python·agent·harmonyos
量化分析码农5 小时前
股票数据接口返回字段逐项解析:从在线验证到 Python 数据校验
python