第67天:PyQuery 详解

简介: 第67天:PyQuery 详解

PyQuery 库是一个非常强大又灵活的网页解析库,如果你有前端开发经验,那么你应该接触过 jQuery ,那么 PyQuery 就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严格实现,语法与 jQuery 几乎完全相同。

安装

跟安装其他库一样:


>>> pip3 install pyquery

安装了之后,在程序里面就可以引用了,引用方法跟其他库类似:


from pyquery import PyQuery as pq

初始化

PyQuery 可以将 HTML 字符串初始化为对象,也可以将 HTML 文件初始化为对象,甚至可以将请求的响应初始化为对象。下面我们一个个来介绍。


初始化字符串


对于一个标准的 HTML 字符串,PyQuery 可以直接初始化为对象:


html = """<html>    <head>        我爱我的祖国        <title>China</title>    </head>    <body>        <ul id="container">            <li class="li1">五星</li>            <li class="li2">红旗</li>            <li class="li3">迎风飘扬</li>        </ul>    </body></html>"""
doc = pq(html)print(type(doc))print(doc)
# 输出结果<class 'pyquery.pyquery.PyQuery'><html>    <head>        我爱我的祖国        <title>China</title>    </head>    <body>        <ul id="container">            <li class="li1">五星</li>            <li class="li2">红旗</li>            <li class="li3">迎风飘扬</li>        </ul>    </body></html>


我们可以看到,HTML 字符串初始化后,打印出来的是一个 PyQuery 对象。

如果我们的字符串不是 HTML 格式内容,PyQuery 会自动加上段落标签将字符串内容包装成 HTML 内容。例如:


test = '''this is a stringthis is second row'''
doc = pq(test)print(type(doc))print(doc)
# 输出结果<class 'pyquery.pyquery.PyQuery'><p>this is a stringthis is second row</p>


初始化 HTML 文件


初始化文件,只需要加个 filename 参数,指明 文件路径即可:


#filename参数为html文件路径test_html = pq(filename='test.html')print(type(test_html))print(test_html)
# 输出结果<class 'pyquery.pyquery.PyQuery'><html lang="en"><head>    <meta charset="UTF-8"/>    <title>Title</title></head><body>
</body></html>

如果文件不是 HTML 文件,那么初始化的时候会自动加上 HTML 标签。例如:


#filename参数为html文件路径test_txt = pq(filename='test.txt')print(type(test_txt))print(test_txt)
# 输出结果<class 'pyquery.pyquery.PyQuery'><html><body><p>this is a txt</p></body></html>


我的 test.txt 文件中只有一行内容:this is a txt。初始化完后,自动添加了 HTML 标签。


初始化请求响应


我们可以把请求的网址内容初始化为 PyQuery 对象,只需要加个参数 url ,将网址赋值给它即可。例如:



response = pq(url='https://www.baidu.com')print(type(response))print(response)
# 输出结果<class 'pyquery.pyquery.PyQuery'><html> <head><meta http-equiv="content-type" content="text/html;charset=utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=Edge"/><meta content="always" name="referrer"/><link...


我们请求百度的首页,然后初始化为对象,后面内容较多,因此省略。

常用 CSS 选择器

PyQuery 里面 CSS 选择器的用法跟 jQuery 里面是一样的,例如,针对上面的 HTML 字符串内容,我们获取 id 为 container 的标签,然后打印出来:


doc = pq(html)print(type(doc('#container')))print(doc('#container'))
# 输出结果<class 'pyquery.pyquery.PyQuery'><ul id="container">            <li class="li1">五星</li>            <li class="li2">红旗</li>            <li class="li3">迎风飘扬</li>        </ul>

我们也可以用 class 选择器,例如:


print(type(doc('.li2')))print(doc('.li2'))
# 输出结果<class 'pyquery.pyquery.PyQuery'><li class="li2">红旗</li>

再复杂一点,我们可以使用多层选择器,例如:


print(doc('html #container'))
# 输出结果<ul id="container">            <li class="li1">五星</li>            <li class="li2">红旗</li>            <li class="li3">迎风飘扬</li>        </ul>

当然,我们同样可以根据 CSS 选择器修改 HTML 标签的内容:



li2 = doc('.li2')li2.css('font-size', '18px')print(li2)
# 输出结果<li class="li2" style="font-size: 18px">红旗</li>

这里我们给 class 为“li2”的标签加了字体的大小,可以看到返回的内容中有了 style 属性。


虽然 PyQuery 有修改 HTML 内容的方法,但是我们一般不会用到,因为我们一般是解析 HTML 内容,而不是去修改它,大家了解一下即可。

伪类选择器

伪类(Pseudo-classes)是指在 HTML 中,同一个标签,根据其不同的状态,有不同的显示样式。详细的用法可以参考:https://www.runoob.com/css/css-pseudo-classes.html ,里面有详细的介绍。


我们主要应用伪类选择器来解析 HTML,获取我们所需的数据。例如:


pseudo_doc = pq(html)print(pseudo_doc('li:nth-child(2)'))#打印第一个li标签print(pseudo_doc('li:first-child'))#打印最后一个标签print(pseudo_doc('li:last-child'))
# 输出结果<li class="li2">红旗</li>            <li class="li1">五星</li>            <li class="li3">迎风飘扬</li>

我们也可以用 contains 方法来筛选内容,例如:


html = """<html>    <head>        我爱我的祖国        <title>China</title>    </head>    <body>        <ul id="container">            <li class="li1">五星啊</li>            <li class="li2">红旗</li>            <li class="li3">迎风飘扬啊</li>        </ul>    </body></html>"""
pseudo_doc = pq(html)
#找到含有Python的li标签print(pseudo_doc("li:contains('五星')"))
#找到含有好的li标签print(pseudo_doc("li:contains('红')"))
#找到含有啊的li标签print(pseudo_doc("li:contains('啊')"))
# 输出结果<li class="li1">五星啊</li>            <li class="li2">红旗</li>
<li class="li1">五星啊</li>            <li class="li3">迎风飘扬啊</li>


我们可以看到,如果查找的结果有多条记录,那么结果会将多条记录拼在一起。当然,如果查找的内容不存在,就会返回空。

查找标签

我们可以按照条件在 Pyquery 对象中查找符合条件的标签,类似于 BeautifulSoup 中的 find 方法。例如,我要查找 id 为 container 的标签:


#打印id为container的标签print(doc.find('#container'))
# 输出结果<ul id="container">            <li class="li1">五星啊</li>            <li class="li2">红旗</li>            <li class="li3">迎风飘扬啊</li>        </ul>

我要查找 id 为 container 的标签的子标签,使用 children 方法就可以实现:



#打印id为container的标签的子标签container = doc.find('#container')print(container.children())
# 输出结果<li class="li1">五星啊</li>            <li class="li2">红旗</li>            <li class="li3">迎风飘扬啊</li>

查找父标签,我们可以用 parent 方法:


#打印id为container的标签的父标签container = doc.find('#container')print(container.parent())
# 输出结果<body>        <ul id="container">            <li class="li1">五星啊</li>            <li class="li2">红旗</li>            <li class="li3">迎风飘扬啊</li>        </ul>    </body>

查找兄弟标签,我们用 siblings 方法:


#打印class为li2的标签的兄弟标签li2 = doc.find('.li2')print(li2.siblings())
# 输出结果<li class="li1">五星啊</li>            <li class="li3">迎风飘扬啊</li>

标签信息的提取

前面我们讲的都是怎么定位到标签,这只是我们解析数据的第一步,接下来我们需要从标签中提取我们需要的信息。


如果你需要提取标签的属性值,可以用 .attr() 方法,例如:


#获取li2的class属性值print(doc('.li2').attr('class'))
# 输出结果li2

如果你细腰提取标签内的文本,我们可以用 .text() 方法,例如:


#获取li2的文本print(doc('.li2').text())
# 输出结果红旗

如果要获取某个标签下面的所有文本(包含子标签的),怎么做?我们来看下个例子:


#获取html标签下面的所有文本print(doc('html').text())
# 输出结果我爱我的祖国China五星啊红旗迎风飘扬啊

很简单,我们只需要找到这个标签,使用 .text() 方法。

如果我们要获取某个标签下面的所有文本,但是要排除某些标签的文本,该怎么做?我们来看下个例子:


#排除部分标签文本tag = doc('html')tag.remove('title')print(tag.text())
# 输出结果我爱我的祖国五星啊红旗迎风飘扬啊

我们可以用 .remove() 来删除某些标签,上面例子中可以看到,我们把 title 标签去掉了,title 标签对应的内容 China 也就去掉了。

PyQuery 处理复杂的网址请求

前面我们介绍了 PyQuery 可以获取网址请求的 HTML 内容,并转化为对象。我们在请求 URL 时,或许会遇到需要附带一些参数的情况,这些自定义的参数在 PyQuery 请求时也是支持的,例如 cookies 和 headers,我们看例子:


cookies = {'Cookie':'cookie'}headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}
response = pq(url='https://www.baidu.com',headers=headers,cookies=cookies)print(response)
#返回(省略)
<head>        <meta http-equiv="content-type" content="text/html;charset=utf-8"/>...

总结

这篇文章给大家介绍了 PyQuery 的常见使用方法,大家如果用的熟练的话,还是可以极大地节约我们解析 HTML 网页内容的时间的。PyQuery 可以称得上是爬虫神器,还有一些用法由于篇幅有限,没有进行介绍。大家可以去官网详细查看,官网地址:


https://pythonhosted.org/pyquery/ 。


文中示例代码:https://github.com/JustDoPython/python-100-day/tree/master/day-067


系列文章


第66天:爬虫利器 Beautiful Soup 之搜索文档

第65天:爬虫利器 Beautiful Soup 之遍历文档

第64天:XPath 和 lxml

第63天:正则表达式

第62天:HTTP 入门

第61天:Python Requests 库高级用法

从 0 学习 Python 0 - 60 大合集总结

目录
相关文章
|
10月前
|
存储 JSON 编解码
06 | RPC 实战:剖析 gRPC 源码,动手实现一个完整的 RPC
本讲通过剖析gRPC源码,实战实现RPC框架。以HelloWorld为例,讲解如何通过Protocol Buffer定义接口、生成客户端与服务端代码,深入分析gRPC基于HTTP/2的请求发送与接收原理,揭示序列化、Frame构造、Netty传输等核心机制,帮助读者将理论知识落地为代码实践。(238字)
|
数据挖掘 数据处理 索引
Pandas高级数据处理:多级索引
Pandas的多级索引(MultiIndex)允许在一个轴上拥有多个层次的索引,适用于分层数据处理。可通过列表或已有DataFrame创建多级索引,如按日期和股票代码索引金融数据。常见问题包括索引层级混乱、数据选择困难和聚合操作复杂,解决方法分别为检查参数顺序、使用`loc`和`xs`方法选择数据、用`groupby()`进行聚合。代码案例展示了创建、调整索引层级、选择特定数据及聚合操作。
733 83
|
9月前
|
搜索推荐 数据挖掘 API
京东商品评论API接口指南
京东商品评论API申请需通过京东开放平台,分个人与企业开发者权限。2025最新流程包括:注册账号、选择适用场景(如品牌合作需授权证明)、创建应用并申请接口权限(如item_review)。调用时需传入商品ID、页码、每页数量等参数。获取数据后可用于产品优化、运营提升与竞品分析,驱动业务决策。
|
11月前
|
弹性计算 固态存储 Java
新手上云参考:阿里云服务器购买配置选择注意事项及购买流程参考
对于还未使用过阿里云服务器的新手用户而言,可能不是很清楚阿里云服务器的配置选择及购买过程,对于这些初次接触阿里云的新手来说,究竟该如何挑选合适的云服务器配置,并顺利完成购买呢?这无疑是他们最为关心的问题。为此,小编整理了一份2025年购买阿里云服务器的完整流程指南,旨在为新手用户提供有力的参考,助力他们在购买阿里云服务器配置时少走弯路!
440 1
|
10月前
|
JavaScript Java 数据库连接
中阶段 低代码平台芋道:代码本地运行(☆)
新人入职需拉取项目代码并本地运行,常见问题如JDK、Maven、IDEA版本选择。项目基于Spring Boot + MyBatis Plus + Vue + Element,含RBAC权限、多租户、工作流等功能。需理解技术栈、核心功能与数据库设计,并录制8分钟以上讲解视频,提出未懂问题,快速融入团队。
|
消息中间件 存储 安全
深入理解 Qt 信号槽:高效沟通的桥梁
深入理解 Qt 信号槽:高效沟通的桥梁
1837 1
|
Cloud Native 关系型数据库 分布式数据库
阿里云PolarDB与沃趣科技携手打造一体化数据库解决方案,助推国产数据库生态发展
阿里云瑶池数据库与沃趣科技将继续深化合作,共同推动国产数据库技术的持续创新与广泛应用,为行业生态的繁荣注入更强劲的技术动力。
阿里云PolarDB与沃趣科技携手打造一体化数据库解决方案,助推国产数据库生态发展
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
3080 4
|
机器学习/深度学习 存储 人工智能
【AI系统】计算图与自动微分
自动求导利用链式法则计算雅可比矩阵,从结果节点逆向追溯计算路径,适用于神经网络训练中损失值对网络参数的梯度计算。AI框架中,自动微分与反向传播紧密相连,通过构建计算图实现高效梯度计算,支持动态和静态计算图两种模式。动态图如PyTorch,适合灵活调试;静态图如TensorFlow,利于性能优化。
752 6
【AI系统】计算图与自动微分
|
编解码 缓存 关系型数据库
【MySQL 核心】MySQL数据恢复-dbsake
【MySQL 核心】MySQL数据恢复-dbsake

热门文章

最新文章