PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严格实现。语法与 jQuery 几乎完全相同,所以不用再去费心去记一些奇怪的方法了。

官网地址:http://pyquery.readthedocs.io/en/latest/
jQuery参考文档: http://jquery.cuishifeng.cn/

初始化

初始化的时候一般有三种传入方式:传入字符串,传入url,传入文件

字符串初始化

  1. html = '''
  2. <div>
  3. <ul>
  4. <li class="item-0">first item</li>
  5. <li class="item-1"><a href="link2.html">second item</a></li>
  6. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  7. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  8. <li class="item-0"><a href="link5.html">fifth item</a></li>
  9. </ul>
  10. </div>
  11. '''
  12.  
  13. from pyquery import PyQuery as pq
  14. doc = pq(html)
  15. print(doc)
  16. print(type(doc))
  17. print(doc('li'))

结果如下:

由于PyQuery写起来比较麻烦,所以我们导入的时候都会添加别名:
from pyquery import PyQuery as pq

这里我们可以知道上述代码中的doc其实就是一个pyquery对象,我们可以通过doc可以进行元素的选择,其实这里就是一个css选择器,所以CSS选择器的规则都可以用,直接doc(标签名)就可以获取所有的该标签的内容,如果想要获取class 则doc('.class_name'),如果是id则doc('#id_name')....

URL初始化

  1. from pyquery import PyQuery as pq
  2.  
  3. doc = pq(url="http://www.baidu.com",encoding='utf-8')
  4. print(doc('head'))

文件初始化

我们在pq()这里可以传入url参数也可以传入文件参数,当然这里的文件通常是一个html文件,例如:pq(filename='index.html')

基本的CSS选择器

  1. html = '''
  2. <div id="container">
  3. <ul class="list">
  4. <li class="item-0">first item</li>
  5. <li class="item-1"><a href="link2.html">second item</a></li>
  6. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  7. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  8. <li class="item-0"><a href="link5.html">fifth item</a></li>
  9. </ul>
  10. </div>
  11. '''
  12. from pyquery import PyQuery as pq
  13. doc = pq(html)
  14. print(doc('#container .list li'))

这里我们需要注意的一个地方是doc('#container .list li'),这里的三者之间的并不是必须要挨着,只要是层级关系就可以,下面是常用的CSS选择器方法:

查找元素

子元素
children,find
代码例子:

  1. html = '''
  2. <div id="container">
  3. <ul class="list">
  4. <li class="item-0">first item</li>
  5. <li class="item-1"><a href="link2.html">second item</a></li>
  6. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  7. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  8. <li class="item-0"><a href="link5.html">fifth item</a></li>
  9. </ul>
  10. </div>
  11. '''
  12. from pyquery import PyQuery as pq
  13. doc = pq(html)
  14. items = doc('.list')
  15. print(type(items))
  16. print(items)
  17. lis = items.find('li')
  18. print(type(lis))
  19. print(lis)

运行结果如下

从结果里我们也可以看出通过pyquery找到结果其实还是一个pyquery对象,可以继续查找,上述中的代码中的items.find('li') 则表示查找ul里的所有的li标签
当然这里通过children可以实现同样的效果,并且通过.children方法得到的结果也是一个pyquery对象

  1. li = items.children()
  2. print(type(li))
  3. print(li)

同时在children里也可以用CSS选择器

li2 = items.children('.active') print(li2)

父元素
parent,parents方法

通过.parent就可以找到父元素的内容,例子如下:

  1. html = '''
  2. <div id="container">
  3. <ul class="list">
  4. <li class="item-0">first item</li>
  5. <li class="item-1"><a href="link2.html">second item</a></li>
  6. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  7. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  8. <li class="item-0"><a href="link5.html">fifth item</a></li>
  9. </ul>
  10. </div>
  11. '''
  12. from pyquery import PyQuery as pq
  13. doc = pq(html)
  14. items = doc('.list')
  15. container = items.parent()
  16. print(type(container))
  17. print(container)

通过.parents就可以找到祖先节点的内容,例子如下:

  1. html = '''
  2. <div class="wrap">
  3. <div id="container">
  4. <ul class="list">
  5. <li class="item-0">first item</li>
  6. <li class="item-1"><a href="link2.html">second item</a></li>
  7. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  8. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  9. <li class="item-0"><a href="link5.html">fifth item</a></li>
  10. </ul>
  11. </div>
  12. </div>
  13. '''
  14. from pyquery import PyQuery as pq
  15. doc = pq(html)
  16. items = doc('.list')
  17. parents = items.parents()
  18. print(type(parents))
  19. print(parents)

结果如下:从结果我们可以看出返回了两部分内容,一个是的父节点的信息,一个是父节点的父节点的信息即祖先节点的信息

同样我们通过.parents查找的时候也可以添加css选择器来进行内容的筛选

兄弟元素
siblings

  1. html = '''
  2. <div class="wrap">
  3. <div id="container">
  4. <ul class="list">
  5. <li class="item-0">first item</li>
  6. <li class="item-1"><a href="link2.html">second item</a></li>
  7. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  8. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  9. <li class="item-0"><a href="link5.html">fifth item</a></li>
  10. </ul>
  11. </div>
  12. </div>
  13. '''
  14. from pyquery import PyQuery as pq
  15. doc = pq(html)
  16. li = doc('.list .item-0.active')
  17. print(li.siblings())

代码中doc('.list .item-0.active') 中的.tem-0和.active是紧挨着的,所以表示是并的关系,这样满足条件的就剩下一个了:thired item的那个标签了
这样在通过.siblings就可以获取所有的兄弟标签,当然这里是不包括自己的
同样的在.siblings()里也是可以通过CSS选择器进行筛选

遍历

单个元素

  1. html = '''
  2. <div class="wrap">
  3. <div id="container">
  4. <ul class="list">
  5. <li class="item-0">first item</li>
  6. <li class="item-1"><a href="link2.html">second item</a></li>
  7. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  8. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  9. <li class="item-0"><a href="link5.html">fifth item</a></li>
  10. </ul>
  11. </div>
  12. </div>
  13. '''
  14. from pyquery import PyQuery as pq
  15. doc = pq(html)
  16. li = doc('.item-0.active')
  17. print(li)
  18.  
  19. lis = doc('li').items()
  20. print(type(lis))
  21. for li in lis:
  22. print(type(li))
  23. print(li)

运行结果如下:从结果中我们可以看出通过items()可以得到一个生成器,并且我们通过for循环得到的每个元素依然是一个pyquery对象。

获取信息

获取属性
pyquery对象.attr(属性名)
pyquery对象.attr.属性名

  1. html = '''
  2. <div class="wrap">
  3. <div id="container">
  4. <ul class="list">
  5. <li class="item-0">first item</li>
  6. <li class="item-1"><a href="link2.html">second item</a></li>
  7. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  8. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  9. <li class="item-0"><a href="link5.html">fifth item</a></li>
  10. </ul>
  11. </div>
  12. </div>
  13. '''
  14. from pyquery import PyQuery as pq
  15. doc = pq(html)
  16. a = doc('.item-0.active a')
  17. print(a)
  18. print(a.attr('href'))
  19. print(a.attr.href)

所以这里我们也可以知道获得属性值的时候可以直接a.attr(属性名)或者a.attr.属性名

获取文本
在很多时候我们是需要获取被html标签包含的文本信息,通过.text()就可以获取文本信息

  1. html = '''
  2. <div class="wrap">
  3. <div id="container">
  4. <ul class="list">
  5. <li class="item-0">first item</li>
  6. <li class="item-1"><a href="link2.html">second item</a></li>
  7. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  8. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  9. <li class="item-0"><a href="link5.html">fifth item</a></li>
  10. </ul>
  11. </div>
  12. </div>
  13. '''
  14. from pyquery import PyQuery as pq
  15. doc = pq(html)
  16. a = doc('.item-0.active a')
  17. print(a)
  18. print(a.text())

结果如下:

获取html
我们通过.html()的方式可以获取当前标签所包含的html信息,例子如下:

  1. html = '''
  2. <div class="wrap">
  3. <div id="container">
  4. <ul class="list">
  5. <li class="item-0">first item</li>
  6. <li class="item-1"><a href="link2.html">second item</a></li>
  7. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  8. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  9. <li class="item-0"><a href="link5.html">fifth item</a></li>
  10. </ul>
  11. </div>
  12. </div>
  13. '''
  14. from pyquery import PyQuery as pq
  15. doc = pq(html)
  16. li = doc('.item-0.active')
  17. print(li)
  18. print(li.html())

结果如下:

DOM操作

addClass、removeClass
熟悉前端操作的话,通过这两个操作可以添加和删除属性

  1. html = '''
  2. <div class="wrap">
  3. <div id="container">
  4. <ul class="list">
  5. <li class="item-0">first item</li>
  6. <li class="item-1"><a href="link2.html">second item</a></li>
  7. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  8. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  9. <li class="item-0"><a href="link5.html">fifth item</a></li>
  10. </ul>
  11. </div>
  12. </div>
  13. '''
  14. from pyquery import PyQuery as pq
  15. doc = pq(html)
  16. li = doc('.item-0.active')
  17. print(li)
  18. li.removeClass('active')
  19. print(li)
  20. li.addClass('active')
  21. print(li)

attr,css
同样的我们可以通过attr给标签添加和修改属性,
如果之前没有该属性则是添加,如果有则是修改
我们也可以通过css添加一些css属性,这个时候,标签的属性里会多一个style属性

  1. html = '''
  2. <div class="wrap">
  3. <div id="container">
  4. <ul class="list">
  5. <li class="item-0">first item</li>
  6. <li class="item-1"><a href="link2.html">second item</a></li>
  7. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  8. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  9. <li class="item-0"><a href="link5.html">fifth item</a></li>
  10. </ul>
  11. </div>
  12. </div>
  13. '''
  14. from pyquery import PyQuery as pq
  15. doc = pq(html)
  16. li = doc('.item-0.active')
  17. print(li)
  18. li.attr('name', 'link')
  19. print(li)
  20. li.css('font-size', '14px')
  21. print(li)

结果如下:

remove
有时候我们获取文本信息的时候可能并列的会有一些其他标签干扰,这个时候通过remove就可以将无用的或者干扰的标签直接删除,从而方便操作

  1. html = '''
  2. <div class="wrap">
  3. Hello, World
  4. <p>This is a paragraph.</p>
  5. </div>
  6. '''
  7. from pyquery import PyQuery as pq
  8. doc = pq(html)
  9. wrap = doc('.wrap')
  10. print(wrap.text())
  11. wrap.find('p').remove()
  12. print(wrap.text())

结果如下:

pyquery中DOM的其他api操作参考:
http://pyquery.readthedocs.io/en/latest/api.html

Python的网页解析库-PyQuery的更多相关文章

  1. Python网页解析库:用requests-html爬取网页

    Python网页解析库:用requests-html爬取网页 1. 开始 Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等.在网上玩爬虫的文章通常都是 ...

  2. 【Python爬虫】BeautifulSoup网页解析库

    BeautifulSoup 网页解析库 阅读目录 初识Beautiful Soup Beautiful Soup库的4种解析器 Beautiful Soup类的基本元素 基本使用 标签选择器 节点操作 ...

  3. 网页解析库-Xpath语法

    网页解析库 简介 除了正则表达式外,还有其他方便快捷的页面解析工具 如:lxml (xpath语法) bs4 pyquery等 Xpath 全称XML Path Language, 即XML路径语言, ...

  4. Python_爬虫_BeautifulSoup网页解析库

    BeautifulSoup网页解析库 from bs4 import BeautifulSoup 0.BeautifulSoup网页解析库包含 的 几个解析器 Python标准库[主要,系统自带;] ...

  5. python爬虫网页解析之lxml模块

    08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...

  6. python爬虫网页解析之parsel模块

    08.06自我总结 python爬虫网页解析之parsel模块 一.parsel模块安装 官网链接https://pypi.org/project/parsel/1.0.2/ pip install ...

  7. 小白学 Python 爬虫(23):解析库 pyquery 入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. Python爬虫【解析库之pyquery】

    该库跟jQuery的使用方法基本一样  http://pyquery.readthedocs.io/ 官方文档 解析库的安装 pip3 install pyquery 初始化 1.字符串初始化 htm ...

  9. python3解析库pyquery

    pyquery是一个类似jquery的python库,它实现能够在xml文档中进行jQuery查询,pyquery使用lxml解析器进行快速在xml和html文档上操作,它提供了和jQuery类似的语 ...

随机推荐

  1. @Transactional(rollbackFor)

    @Transactional注解有两个,一个是spring提供的@org.springframework.transaction.annotation.Transactional 另一个是jdk提供@ ...

  2. scala简单的功能实现~weekone

    以下是scala简单的入门题~ 1.⼀个数字如果为正数,则它的signum为1:如果是负数,怎么signum为-1:如果是0,则signum 为0.编写⼀个函数来计算这个值. object Test ...

  3. 32、MySQL简介

    一.MySQL简介 1.数据库管理软件分类 主要分为关系型和非关系型. 可以简单的理解为,关系型数据库需要有表结构,非关系型数据库是key-value存储的,没有表结构. 关系型:如sqllite,d ...

  4. PHP数组操作类

    class ArrayHelper{           /**      * 从数组中删除空白的元素(包括只有空白字符的元素)      *      * 用法:      * @code php ...

  5. self & _cmd

    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles ...

  6. BZOJ 5306: [Haoi2018]染色 二项式反演+NTT

    给定长度为 $n$ 的序列, 每个位置都可以被染成 $m$ 种颜色中的某一种. 如果恰好出现了 $s$ 次的颜色有 $k$ 种, 则会产生 $w_{k}$ 的价值. 求对于所有可能的染色方案,获得价值 ...

  7. 错误解决Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: pers.zhb.domain.Student column: classno (should be mapped with insert="false" update="false")

    1.在学习hibernate的一对多多对一关系的时候,出现了一下错误: 2.错误原因: 这是因为在配置student.hbm.xml的配置文件的时候出现了将两个属性映射到同一个字段: <?xml ...

  8. bzoj3745: [Coci2015]Norma 分治,单调队列

    链接 bzoj 思路 首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解.参见 ...

  9. OpenVSwitch实验参考

    1. 使用Floodlight管理OVS桥 (1) 下载:https://codeload.github.com/floodlight/floodlight/tar.gz/v1.2 (2) tar x ...

  10. 【AtCoder】 ARC 101

    link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...