PyQuery库使用详解

2023-11-02


PyQuery是python中一个强大而又灵活的网页解析库,如果你觉得正则写起来太麻烦,又觉得BeautifulSoup语法太难记,如果你熟悉jQuery的语法那么,PyQuery就是你绝佳的选择。
安装:pip3 install pyquery

一、初始化

下面介绍三种初始化PyQuery的方法。

1.字符串初始化

html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq#习惯写法,用字母pq来代替PyQuery类
doc = pq(html)#声明PyQuery对象doc,传入html这个参数(字符串)
print(doc('li'))#用css选择器来实现,如果要选id前面加#,如果选class,前面加.,如果选标签名,什么也不加

在这里插入图片描述
如图,所以li标签内容被选择,并将内容打印出来。

2. URL初始化

from pyquery import PyQuery as pq
doc=pq(url='http://www.baidu.com')#直接请求传入的url
print(doc('head'))

在这里插入图片描述
选择出了head标签。

3.文件初始化

from pyquery import PyQuery as pq
doc=pq(filename='demo.html')#指定文件名,该文件在运行目录下
print(doc('head'))

二、基本CSS选择器

html = '''
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))
#会查找id为container class为list,标签为li的对象,只是层级关系,后者并非一定是前者的子对象
#注意用空格隔开

在这里插入图片描述

三、查找元素

查找子元素

html = '''
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''


from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')#拿到items,里面选择了list类
print(type(items))
print(items)
lis = items.find('li')#利用find方法,查找items里面的li标签,得到的lis也可以继续调用find方法往下查找,层层剥离
print(type(lis))
print(lis)

在这里插入图片描述
打印出来的内容如上图,上方的是list类中的所有内容,下方的是类中所有li标签的内容。

也可以用**.children()**查找直接子元素:

items = doc('.list')
lis = items.children()
print(type(lis))
print(lis)
lis = items.children('.active')
print(lis)

查找父元素

html = '''
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
container = items.parent()#.parent()查找对象的父元素
print(type(container))
print(container)

在这里插入图片描述
list类的父节点是container,被全部打印出来了。

祖先节点

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
#parents = items.parents()#.parents()查找所有的祖先节点
parent = items.parents('.wrap')#可以传入参数,再次进行筛选
print(parent)

在这里插入图片描述
找出所有祖先节点中,类为wrap的节点。

兄弟元素

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')#空格表示下一层,没有空格表示并列
print(li.siblings())#.siblings()兄弟元素,即同级别的元素,不包括自己

在这里插入图片描述
如图,选出了4个兄弟元素。
当然啦,还可以从结果里再次进行筛选:

print(li.siblings('.active'))#

在这里插入图片描述

四、遍历

如果查找的结果有多个元素,并且你想对每一个都进行操作,那么就要用到遍历了。遍历的关键就是items。

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
lis = doc('li').items()#.items会是一个生成器,可以用来遍历
print(type(lis))
for li in lis:
    print(li)

在这里插入图片描述

五、获取信息

获取属性

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')#选出同时具备这item-0,active两个信息的标签 空格表示这个标签内层的标签
print(a)
print(a.attr('href'))#a标签的href属性的内容,也就是一个超链接
print(a.attr.href)#另一种写法

在这里插入图片描述

获取文本

from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')#选出同时具备这item-0,active两个信息的标签 空格表示这个标签内层的标签
print(a)
print(a.text())#获取该标签中的内容

在这里插入图片描述

获取HTML

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')#选中一个li标签
print(li)
print(li.html())#获得该标签中的html内容

在这里插入图片描述

六、DOM操作

对节点进行一些操作。这部分有许多的API,这里举一些例子。

addClass、removeClass

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.removeClass('active')#删除active这个class属性
print(li)
li.addClass('active')#增加
print(li)

在这里插入图片描述

attr、css

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name','link')#如果不存在,就会向标签中添加一个内容为link的name属性,如果存在,那就改变之
print(li)
li.css('font-size','14px')#增加一个css
print(li)

在这里插入图片描述

remove

看下面的一段html,我们想要单独获得“Hello World”内容,但是和他并列的还有另外的内容,如果我们直接选中wrap标签然后.text,那么会获取两段内容。这时候可以先用remove方法把不需要的并列内容删除掉。


html = '''
<div class="wrap">
    Hello, World
    <p>This is a paragraph.</p>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc('.wrap')
print(wrap.text())
wrap.find('p').remove()#找到p标签然后删除
print(wrap.text())

在这里插入图片描述
红框中的是删除之前的内容。删除之后就可以单独取得代码之祖:“Hello World”啦!

其他DOM方法

其他DOM方法
http://pyquery.readthedocs.io/en/latest/api.html
以上网址列出了所以的API,有需求时可查看。

#七、伪类选择器
根据自身需要(顺序之类的),选择指定的标签。

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li:first-child')#选择li标签中的第一个
print(li)
li = doc('li:last-child')
print(li)
li = doc('li:nth-child(2)')#获取第2个li标签
print(li)
li = doc('li:gt(2)')#获取索引2个以后的li标签。注意!索引是从0开始的
print(li)
li = doc('li:nth-child(2n)')#获取第偶数个的li标签
print(li)
li = doc('li:contains(second)')#查找包含"second"文本的li标签
print(li)

在这里插入图片描述
更多CSS选择器可以查看 http://www.w3school.com.cn/css/index.asp

官方文档
http://pyquery.readthedocs.io/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQuery库使用详解 的相关文章

  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s

随机推荐

  • maven release版本重复上传error

    A couple things I can think of user credentials are wrong url to server is wrong user does not have access to the deploy
  • 【2023】华为OD机试真题Java-题目0209-找出通过车辆最多颜色

    找出通过车辆最多颜色 题目描述 在一个狭小的路口 每秒只能通过一辆车 假如车辆的颜色只有3种 找出 N N N 秒内经过的最多颜色的车辆数量 三种颜色编号为0 1 2 输入描述 第一行输入的是通过的车辆颜色信息 0 1 1 2 代表4秒钟通
  • python识别视频中火焰_监控视频中火焰检测算法

    基于视频的火焰的检测 如果通过采集监控摄像头的画面 监控广大区域 发现着火区域 能够快速报警的话 就可以有效提高监控的效果 提早报警 大大减少财产损失和人员伤亡 我们视觉上发现火灾的途径有2个 通过观察火焰 及时发现火灾 通过观察烟雾 及时
  • 【前端面试】VUE面试常问(内含个人整理与总结)

    我为什么选择vue 个人感觉编码方式和html差别不大 上手很块 对新手友好 vue与react的比较 React是库 Vue则是完整的框架相同点 都是数据驱动视图 都遵循组件化思想 遵循基于可重用组件的方法 提供component方法 都
  • 【深度学习】——如何提高map值

    目录 代码获取 map原理 map提高技巧 技巧总结 实战 1 效果不佳map55 55 1 单独调整get dr txt py中的self iou 0 3 2 单独调整get map py中的minoverlap 3 同时调整minove
  • 修改vscode的exe生成位置

    修改vscode的exe生成位置 概述 注意 修改task json文件 修改launch json文件 概述 在windows系统使用vscode学习C 时 调试的时候会在cpp文件的目录里生成一个exe文件 造成文件很多 有点乱 就想着
  • '2.587426955E9' in column '2' is outside valid range for the datatype INTEGER.

    今天在展现人员信息时遇到这个错误 2 587426955E9 in column 2 is outside valid range for the datatype INTEGER 在网上查了 说是超出了INTEGER的最大长度 后经实践检
  • java 将图片转为base64返回给前端

    一 controller端代码 RequestMapping value captcha public void imagecode HttpServletRequest request HttpServletResponse respon
  • vue:前端接收并展示后端返回的一个图片对象(文件流)

    需求 前端接收并展示后端返回的一个图片对象 文件流 没有图片的时候 显示默认图片 1 HTML 造空间 展示图片 div class qrcodeBox img div 2 定义变量 这里require的作用是设置默认图片 data ret
  • H5页面在ios的浏览器上使用 高德地图 报当前定位失败Geolocation permission denied 或者 偶尔报AMap没有找到的

    1 解决报当前定位失败Geolocation permission denied 可以去高德api查看 常见问题 高德地图API amap com 图中红圈2 3 4 5 6对应Geolocation permission denied报错
  • JDBC中获取连接的几种方式,快来看看吧

    注 下面的连接均是以mysql为例 Test是Junit4的注解用于测试 Properties不会的话可自行百度 可能存在某些不规范的说法或者错误 恳请各位指出错误 方式一 import com mysql cj jdbc Driver i
  • Java模拟formdata发送请求-文件上传

    public String upload HttpHeaders httpHeaders RestTemplateUtils basicAuthenticationInfo poAuthConfig getUsername poAuthCo
  • java爬虫爬取主流房屋网站

    最近博主要做一些分析课题 所以使用java爬取了主流的房屋网站 搞些事情 下面是我搞事情的思路 在结尾处我会投放我的源码文件 供大家下载 导航 设计思路 项目的包与类详解 部分重要代码展示 源码下载 设计思路 想要爬取房屋的网站 就要有以下
  • ELM和RVFL两种网络的超详细介绍

    最近一直在跑程序 在看文章时注意到了这两种网络 ELM和RVFL 自己查阅资料做了简单的总结 希望在大家学习时帮助到大家 一 RVFL Random vector functional link network 首先明确一点 在进行分类的时
  • 【学习记录】win10 + ubuntu 22.04双系统安装

    一 背景 因为家里的台式 Windows 10 最近一直频繁蓝屏 再加上Win10之前经常性的资源管理器未响应 对Windows系统逐渐失去了信心 于是想着安装稳定性较好的Linux 以前抵触Linux是因为其人机交互界面没Windows那
  • Rabbit MQ使用

    rabbitmq支持 net framwork 3 5的最后版本 rabbitmq支持 net framwork 3 5的最后版本是3 4 3 安装步骤 1 工具 gt 库程序包管理器 进入程序包管控制台 2 Install Package
  • Python学习笔记 之 从入门到放弃

    笔记目录 9月22日 基础教程 基础知识 模块导入 用变量引用函数 或者Python中大多数的对象 将数值转换成字符串的方法 str类型 repr函数 9月23日 列表 元组 序列索引可以为负数 序列的分片和步长 序列相加 乘法 列表和字符
  • 深聊性能测试,从入门到放弃之:Locust性能自动化(二)代码实战

    Locust代码实战 1 引言 2 Locust实例展示 2 1 官网代码示例 2 2 Locust 代码模板及执行顺序 3 Locust 类代码分析 3 1 实例代码展示 3 2 classTaskSet 用法及展示 3 2 1 定义 3
  • caffe FCN网络的训练——以SIFT-Flow 数据集为例

    原文 http www cnblogs com xuanxufeng p 6243342 html 我在练习中根据操作稍微修改了一些内容 caffe fcn学习资料收集 可以参考这个训练 http blog csdn net wangkun
  • PyQuery库使用详解

    目录 一 初始化 1 字符串初始化 2 URL初始化 3 文件初始化 二 基本CSS选择器 三 查找元素 查找子元素 查找父元素 祖先节点 兄弟元素 四 遍历 五 获取信息 获取属性 获取文本 获取HTML 六 DOM操作 addClass