爬虫学习: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的使用相关推荐

  1. Python爬虫学习系列教程

    大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫 ...

  2. Python爬虫学习系列教程-----------爬虫系列 你值的收藏

    静觅 » Python爬虫学习系列教程:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把 ...

  3. python contains类似函数_五步教会你用python爬虫神器PyQuery!(内含详细步骤和代码)...

    前言: 今天为大家带来的内容,是五步教会你用python爬虫神器PyQuery!(内含详细步骤和代码),在这里还是要啰嗦下,为了有更好的观赏性,大部分代码用图片的方式呈现出来!喜欢的话不忘点赞关注不迷 ...

  4. Python3 爬虫学习笔记 C17【爬虫框架 pyspider — 基本使用】

    Python3 爬虫学习笔记第十七章 -- [爬虫框架 pyspider - 基本使用] 文章目录 [17.1]初识 pyspider [17.2]使用 pyspider [17.2.1]主界面 [1 ...

  5. Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】

    Python3 爬虫学习笔记第四章 -- [自动化测试工具 Selenium] 文章目录 [4.1]下载驱动 [4.2]声明浏览器对象 [4.3]访问页面 [4.4]启动参数 [4.5]查找节点 [4 ...

  6. Python 爬虫学习 系列教程

    Python爬虫 --- 中高级爬虫学习路线 :https://www.cnblogs.com/Eeyhan/p/14148832.html 看不清图时,可以把图片保存到本地在打开查看... Pyth ...

  7. b站学python_Python爬虫学习教程 bilibili网站视频爬取!【附源码】

    python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...

  8. python网络爬虫学习资料

    第一:Python爬虫学习系列教程(来源于某博主:http://cuiqingcai.com/1052.html) Python版本:2.7 整体目录: 一.爬虫入门 1. Python爬虫入门一之综 ...

  9. Python的爬虫学习笔记本(一)爬虫的基本原理

    NLP的任务往往需要大量的语料库作为数据集,而尽管现有的许多任务上都有固定的数据集,但还是在很多方面存在着欠缺.为了弥补这个欠缺,网上的大量免费的文本信息就需要通过爬虫爬下来.由此开始了爬虫的学习. ...

最新文章

  1. RabbitMQ Java 基本API
  2. getprivateprofilestring读不到数据_电商系列(三)如何构建数据库的主从架构!
  3. 对抗canary保护技术的几种方式
  4. php跨域同步登录,织梦PC端移动端会员同步登录跨域AJAX
  5. [蓝桥杯]错误票据---stringstream应用举例
  6. html代码里面换图片不显示不出来了,微擎 Ueditor 百度编辑器 替换图片不显示问题...
  7. Menagerie(AtCoder-2234)
  8. 终端安装解决svn cannot set LC_CTYPE locale的问题
  9. CSS挂马及相应防范方法
  10. jsonrpc php使用,php实现的一个简单jsonrpc框架实例
  11. kubernetes视频教程笔记 (1)-什么是kubernetes和kubernetes的知识结构思维导图
  12. Kubernetes实践:使用k8s部署微服务应用
  13. 国美金融APP如何提前结清所有贷款
  14. MongoDB下载(速度较快操作)
  15. Linux 软件写文件权限,Linux 文件和目录的读写执行权限详解
  16. FigDraw 11. SCI 文章绘图之小提琴图 (ViolinPlot)
  17. 以Mapgis与Arcinfo之间的数据转换
  18. 使用Itext结合Jfreechart图表导出带图表的word文档
  19. 人人美剧迅雷链接多线程和多进程爬虫分析
  20. 无线鼠标迟钝但并不是电量问题

热门文章

  1. 自定义ZYNQ的PL端数据处理器,通过DMA等进行交互(附GitHub源码)
  2. 有感~半导体技术之晶圆尺寸,450mm是否会来到
  3. 机器学习(监督,无监督,强化学习及线性回归)
  4. P4-learning——ecmp
  5. 手把手教你注册 das 域名账户,埋伏空投
  6. codeforces 894D
  7. C++ 左移运算符和右移运算符的使用
  8. HKC神盾电竞显示器MG24Q - 学生电竞宿舍必备神机
  9. 400以内蓝牙耳机哪款好?南卡和FIIL蓝牙耳机测评大PK!
  10. 【滤波器】基于汉宁窗FIR滤波器实现语音信号加噪去噪含Matlab源码