爬虫学习:pyquery的使用
爬虫学习:pyquery的使用
文章目录
- 爬虫学习:pyquery的使用
- 一、前言
- 二、我的环境
- 三、准备工作
- 1、下载安装
- 2、初始化
- 3、基本的CSS选择器
- 四、pyquery库的基本用法
- 1、查找节点
- 2、遍历节点
- 3、节点操作
- 4、伪类选择器
- 五、最后我想说
一、前言
刚开学没几天,比较忙,所以有一段时间没有更新博客了,上学前几天,没有写博客,是因为我当时正在研究人工智能,目前还在整理,后续我会把它总结发出来的。
这是我的学习专栏:Python爬虫学习
前面我们学习了Beautiful Soup的使用,最后我们提到了CSS选择器,Beautiful Soup库在CSS选择器上并没有很强大,所以这次我们学习一个新的工具——今天的主角:pyquery。
让我们一起来学习有关pyquery的知识吧!
二、我的环境
- 电脑系统:Windows 11
- 语言版本:Python 3.10.4
- 编译器:VsCode
三、准备工作
1、下载安装
在cmd或者vscode终端输入如下命令:
pip install pyquery
2、初始化
pyquery解析HTML文本的时候有很多种初始化方法,比如字符串初始化,URL初始化,文件初始化等等,我所说的三种方法对应的就分别传入字符串、URL和文件来初始化的。
字符串初始化
直接使用HTML文本当作初始化参数:
from pyquery import PyQuery as pqhtml = """ <div><ul><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li></ul> </div> """ doc = pq(html) print(doc('li'))
他运行的结果是:
<li class="item0">message</li> <li class="item1"><a href="link2.html">message2</a></li> <li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li> <li class="item1 active"><a href="link4.html">meaasge4</a></li> <li class="item0"><a href="link5.html">message5</a></li>
URL初始化
使用网页的URL来当作初始化参数
from pyquery import PyQuery as pqdoc = pq(url='https://baidu.com') print(doc('title'))
它运行的结果是:
<title>百度一下,你就知道</title>
也可以直接使用requests库来获取URL
from pyquery import PyQuery as pq import requestsdoc = pq(requests.get('https://baidu.com').text) print(doc('title'))
这个结果跟上面的一样,两个方法是等效的。
文件初始化
也就是通过传递本地文件作为参数来实现的。
from pyquery import PyQuery as pq doc == pq(filename = 'test.html') print(doc('li'))
3、基本的CSS选择器
先举个例子:
from pyquery import PyQuery as pqhtml = """
<div id="container"><ul><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li></ul>
</div>
"""
doc = pq(html)
print(doc('#container .list li'))
for item in doc('#container .list li').itenms():print(item.text)
它运行的结果是:
<li class="item0">message</li>
<li class="item1"><a href="link2.html">message2</a></li>
<li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li>
<li class="item1 active"><a href="link4.html">meaasge4</a></li>
<li class="item0"><a href="link5.html">message5</a></li>
message
message2
message3
message4
message5
这里的CSS选择器就是‘#container .list li’,它的意思是先选取id为container的节点,然后再选取该节点内部class为list的所有li节点,然后再使用for循环和text()方法获取节点内的文本信息。
四、pyquery库的基本用法
1、查找节点
查找子节点
from pyquery import PyQuery as pqhtml = """ <div id="container"><ul class="list"><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li></ul> </div> """ doc = pq(html) items = doc('.list') print(type(items)) print(items) lis = items.find('li') print(type(lis)) print(lis)
它允许的结果是:
<class 'pyquery.pyquery.PyQuery'> <ul class="list"><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li> </ul><class 'pyquery.pyquery.PyQuery'> <li class="item0">message</li> <li class="item1"><a href="link2.html">message2</a></li> <li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li> <li class="item1 active"><a href="link4.html">meaasge4</a></li> <li class="item0"><a href="link5.html">message5</a></li>
find()方法跟之前的一样,会返回所有符合条件的节点,另外如果只想查找子节点,就可以直接使用children()方法,不传入选择器就默认选择全部子节点,传入的话就选择对应的子节点,例如我要寻找class为active的节点:
lis = items.children('.active') print(lis)
它运行的结果是:
<li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li> <li class="item1 active"><a href="link4.html">meaasge4</a></li>
查找父节点
from pyquery import PyQuery as pqhtml = """ <div class="wrap"><div id="container"><ul class="list"><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li></ul></div> </div> """ doc = pq(html) items = doc('.list') container = items.parent() print(container)
它运行的结果是:
<div id="container"><ul class="list"><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li></ul> </div>
使用parent()方法可以获得直接父节点,如果要获取祖先节点,就需要使用parents()方法:
parents = items.parents() print(parents)
它运行的结果是:
<div class="wrap"><div id="container"><ul class="list"><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li></ul></div> </div> <div id="container"><ul class="list"><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li></ul> </div>
parents()方法会返回所有的祖先节点,如果需要返回选定的祖先节点,就需要传入CSS选择器进行选择返回,例如:
parent = items.parents(.wrap) print(parent)
它运行的结果是:
<div class="wrap"><div id="container"><ul class="list"><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li></ul></div> </div>
查找兄弟节点
from pyquery import PyQuery as pqdoc = pq(html) items = doc('.list') li = doc('.list .item0.active') print(li.siblings())
它运行的结果是:
<li class="item1"><a href="link2.html">message2</a></li> <li class="item0">message</li> <li class="item1 active"><a href="link4.html">meaasge4</a></li> <li class="item0"><a href="link5.html">message5</a></li>
如果要从兄弟节点内寻找特定的节点,直接往siblings()中传入选择器即可:
from pyquery import PyQuery as pqdoc = pq(html) items = doc('.list') li = doc('.list .item0.active') print(li.siblings('.active'))
它运行的结果是:
<li class="item1 active"><a href="link4.html">meaasge4</a></li>
2、遍历节点
pyquery返回的结果并不是列表,单个节点或者多个节点,单个节点可以直接打印出来,多个节点就需要一个一个遍历出来,使用items方法遍历:
from pyquery import PyQuery as pqdoc = pq(html)
lis = doc('li').items()
for li in lis:print(li)
它运行的结果是:
<li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li>
获取属性
我们使用attr进行属性获取:
from pyquery import PyQuery as pqdoc = pq(html) a = doc('.item0.active a') print(a) print(a.attr('href'))
它运行的结果是:
<a href="link3.html"><span class="bold">message3</span></a> link3.html
a.attr(‘href’)也可以换成a.attr.href,两者是等效的。
但是如果选择的是多个元素的话,只使用attr是不行的,还需要加上遍历才行:
from pyquery import PyQuery as pqdoc = pq(html) a = doc('a') for item in a.items():print(item.attr('href'))
它运行的结果是:
link2.html link3.html link4.html link5.html
获取文本
获取文本使用text()方法:
from pyquery import PyQuery as pqdoc = pq(html) a = doc('.item0.active a') print(a) print(a.text())
它运行的结果是:
<a href="link3.html"><span class="bold">message3</span></a> message3
如果要获取节点内部的HTML文本就需要使用html方法:
from pyquery import PyQuery as pqdoc = pq(html) li = doc('.item0.active') print(li) print(li.html())
它运行的结果是:
<li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><a href="link3.html"><span class="bold">message3</span></a>
如果获取多个节点的话,text和html方法会返回什么?
from pyquery import PyQuery as pqdoc = pq(html) li = doc('li') print(li.html()) print(type(li.html())) print(li.text()) print(type(li.text()))
它运行的结果是:
message <class 'str'> message message2 message3 meaasge4 message5 <class 'str'>
可以看出,html返回了第一个li节点内的HTML文本,而text方法返回了所有li节点内部的纯文本,返回结果的类型都是字符串类型。
3、节点操作
pyquery提供了非常多能对节点进行动态修改的方法,下面我就总结其中几种常见的方法
addClass和removeClass
from pyquery import PyQuery as pqhtml = """ <div class="wrap"><div id="container"><ul class="list"><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li></ul></div> </div> """ doc = pq(html) li = doc('.item0.active') print(li) li.removeClass('active') print(li) li.addClass('active') print(li)
它运行的结果是:
<li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item0"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li>
显而易见,addClass方法是添加class属性,removeClass方法就是移除class方法。
attr、text和html
from pyquery import PyQuery as pqhtml = """ <ul class="list"><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li> </ul> """ doc = pq(html) li = doc('.item0.active') print(li) li.attr('name', 'link') print(li) li.text('changed item') print(li) li.html('<span>changed item</span') print(li)
它运行的结果是:
<li class="item0 active" name="link"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item0 active" name="link">changed item</li><li class="item0 active" name="link"><span>changed item</span></li>
可以看出,attr方法可以修改属性并添加新属性,text方法可以改变li节点内部的文本,html方法也可以改变li节点内部的HTML本文。
remove
from pyquery import PyQuery as pqhtml = """ <div class="wrap">Hello,World!<p>Hello,Python!</p> </div> """ doc = pq(html) wrap = doc('.wrap') wrap.find('p').remove() print(wrap.text())
它运行的结果是:`
Hello,World!
这里首先选择p节点,然后调用remove方法将其移除,这个时候wrap内就只剩下一个文本了,再调用text方法即可获得。
4、伪类选择器
伪类选择器例如:选择第一个节点,选择最后一个节点,选择奇偶数节点、包含某一文本的节点等等。
from pyquery import PyQuery as pqhtml = """
<div class="wrap"><div id="container"><ul class="list"><li class="item0">message</li><li class="item1"><a href="link2.html">message2</a></li><li class="item0 active"><a href="link3.html"><span class="bold">message3</span></a></li><li class="item1 active"><a href="link4.html">meaasge4</a></li><li class="item0"><a href="link5.html">message5</a></li></ul></div>
</div>
"""
doc = pq(html)
li = doc('li:first-child')
print("选择第一个li节点:", li)
li = doc('li:last-child')
print("选择最后一个li节点:", li)
li = doc('li:nth-child(2)')
print("选择第二个li节点:", li)
li = doc('li:gt(2)')
print("选择第三个li节点之后的li节点:", li)
li = doc('li:nth-child(2n)')
print("选择偶数位置的li节点:", li)
li = doc('li:contains(message2)')
print("选择包含message2的li节点:", li)
它运行的结果是:
选择第一个li节点: <li class="item0">message</li>选择最后一个li节点: <li class="item0"><a href="link5.html">message5</a></li>选择第二个li节点: <li class="item1"><a href="link2.html">message2</a></li>选择第三个li节点之后的li节点: <li class="item1 active"><a href="link4.html">meaasge4</a></li>
<li class="item0"><a href="link5.html">message5</a></li>选择偶数位置的li节点: <li class="item1"><a href="link2.html">message2</a></li>
<li class="item1 active"><a href="link4.html">meaasge4</a></li>选择包含message2的li节点: <li class="item1"><a href="link2.html">message2</a></li>
五、最后我想说
有关pyquery的基本学习就到这里了,但是pyquery中的方法还有很多,需要大家自行去官方文档去学习,篇幅有限,就不列举那么多了。
这篇博客是我使用我刚买的轻薄本来书写的,目前感觉还不错,后续如果是一些轻量的学习,我都会使用这个笔记本进行学习总结,大型项目或者需要高配置的,就会使用我另一个3070的笔记本。
来学校之后就没有在家时间那么多了,目前大三的我,正在学习有关大数据方面的专业课,所以更新慢请见谅,谢谢,后续我也会更新有关我专业课知识的博客,尽情期待,哈哈哈。
来学校之后我会规划一下写博客的时间,以及我会尽快更新我提到的AI语言助手的博客。
最后,文章如果出现错误之处,还请大家为我指出,谢谢!创造不易,期待得到你们的支持!
爬虫学习:pyquery的使用相关推荐
- Python爬虫学习系列教程
大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫 ...
- Python爬虫学习系列教程-----------爬虫系列 你值的收藏
静觅 » Python爬虫学习系列教程:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把 ...
- python contains类似函数_五步教会你用python爬虫神器PyQuery!(内含详细步骤和代码)...
前言: 今天为大家带来的内容,是五步教会你用python爬虫神器PyQuery!(内含详细步骤和代码),在这里还是要啰嗦下,为了有更好的观赏性,大部分代码用图片的方式呈现出来!喜欢的话不忘点赞关注不迷 ...
- Python3 爬虫学习笔记 C17【爬虫框架 pyspider — 基本使用】
Python3 爬虫学习笔记第十七章 -- [爬虫框架 pyspider - 基本使用] 文章目录 [17.1]初识 pyspider [17.2]使用 pyspider [17.2.1]主界面 [1 ...
- Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】
Python3 爬虫学习笔记第四章 -- [自动化测试工具 Selenium] 文章目录 [4.1]下载驱动 [4.2]声明浏览器对象 [4.3]访问页面 [4.4]启动参数 [4.5]查找节点 [4 ...
- Python 爬虫学习 系列教程
Python爬虫 --- 中高级爬虫学习路线 :https://www.cnblogs.com/Eeyhan/p/14148832.html 看不清图时,可以把图片保存到本地在打开查看... Pyth ...
- b站学python_Python爬虫学习教程 bilibili网站视频爬取!【附源码】
python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...
- python网络爬虫学习资料
第一:Python爬虫学习系列教程(来源于某博主:http://cuiqingcai.com/1052.html) Python版本:2.7 整体目录: 一.爬虫入门 1. Python爬虫入门一之综 ...
- Python的爬虫学习笔记本(一)爬虫的基本原理
NLP的任务往往需要大量的语料库作为数据集,而尽管现有的许多任务上都有固定的数据集,但还是在很多方面存在着欠缺.为了弥补这个欠缺,网上的大量免费的文本信息就需要通过爬虫爬下来.由此开始了爬虫的学习. ...
最新文章
- RabbitMQ Java 基本API
- getprivateprofilestring读不到数据_电商系列(三)如何构建数据库的主从架构!
- 对抗canary保护技术的几种方式
- php跨域同步登录,织梦PC端移动端会员同步登录跨域AJAX
- [蓝桥杯]错误票据---stringstream应用举例
- html代码里面换图片不显示不出来了,微擎 Ueditor 百度编辑器 替换图片不显示问题...
- Menagerie(AtCoder-2234)
- 终端安装解决svn cannot set LC_CTYPE locale的问题
- CSS挂马及相应防范方法
- jsonrpc php使用,php实现的一个简单jsonrpc框架实例
- kubernetes视频教程笔记 (1)-什么是kubernetes和kubernetes的知识结构思维导图
- Kubernetes实践:使用k8s部署微服务应用
- 国美金融APP如何提前结清所有贷款
- MongoDB下载(速度较快操作)
- Linux 软件写文件权限,Linux 文件和目录的读写执行权限详解
- FigDraw 11. SCI 文章绘图之小提琴图 (ViolinPlot)
- 以Mapgis与Arcinfo之间的数据转换
- 使用Itext结合Jfreechart图表导出带图表的word文档
- 人人美剧迅雷链接多线程和多进程爬虫分析
- 无线鼠标迟钝但并不是电量问题