python pyquery节点内所有文本_PyQuery详解
在之前写的爬虫入门里,PyQuery一笔带过,这次详细地讲一下。
为什么选择PyQuery?
Python爬虫解析库,主流的有
PyQuery
Beautifulsoup
Scrapy Selectors
正则表达式。
PyQuery和scrapy Selectors都是基于lxml模块,而lxml和正则表达式都是C语言写的,只有Beautifulsoup是用纯Python编写的,所以在实测中,Beautifulsoup 的解析速度比其他几种慢了5倍以上!
正则表达式的构造稍微复杂一点,一般在结构化的网页中没必要用正则(易出错)。Scrapy Selectors支持css,xpath以及正则表达式,PyQuery只支持css(我最开始学的是xpath,后来觉得css语法更精简一些)。Scrapy Selector中的css语法和PyQuery中的略有不同,本文以PyQuery为例(不用Scrapy框架的话,PyQuery就够用了)
如何使用?
首先在命令行里 pip install pyquery 安装一下
我们以果壳首页为例,首先引入,并将源代码实例化
import requests
from pyquery import PyQuery as pq
url = 'https://www.guokr.com/'
r = requests.get(url)
#实例化
doc = pq(r.text)
获取文本
例如你想要各个板块的名字
image
通过f12查看源代码,你发现板块名都在class值为content-title的h2标签下
[图片上传失败...(image-ea4892-1548221385522)]
在PyQuery中,class的值写在小数点 . 后面,标签直接写(ID是写在#后面)
print(doc('h2.content-title'))
[图片上传失败...(image-8ce1d6-1548221385522)]
于是所有满足条件的源代码都出来了,获取标签的文本内容用text()
print(doc('h2.content-title').text())
想遍历的话,
lis = doc('h2.content-title').items()
for li in lis:
print(li.text())
image
假设我们想要获取所有标题
[图片上传失败...(image-eb88cb-1548221385522)]
看源代码会发现 ,小标题的内容都在div.content下面的ul标签 下面的 第二个li标签 开始(通过缩进来看嵌套关系),而第一个li标签里面是大标题的内容
[图片上传失败...(image-84ab15-1548221385522)]
#用空格表示子孙节点
lis = doc('div.content ul li').items()
#lis = doc('div.content li').items()
for i in lis:
print(i.text())
空格表示子孙节点,只要在div.content标签下面的节点,都能获取到
所以上面的代码可以省略ul标签,直接到li标签
有时候标签会有多个类名的情况,例如(我随便构造一个):
[图片上传失败...(image-cd7cd3-1548221385522)]
假设类名为cont的标签不唯一,也就是通过cont不能准确地定位这一个标签,还需要加上其他类名
print(doc('div.cont.a.b.c.d'))
[图片上传失败...(image-759eee-1548221385522)]
[图片上传失败...(image-d6955e-1548221385522)]
标签里的空格表示并列,表示这个div标签有cont,a,b,c,d这五个类名,但在css语法里空格表示嵌套,所以我们要添加其他类名的时候不能输入空格,而是直接用小数点来添加其他类名
获取属性
前面说了获取文本用text(),现在介绍获取属性的方法,即attr("属性名"),比方说我们要获取所有标题的链接,一般来说链接都在href属性里
[图片上传失败...(image-db7abc-1548221385522)]
lis = doc('div.content li').items()
for i in lis:
print(i.text(),i('a').attr('href'))
[图片上传失败...(image-245d6a-1548221385522)]
剩下的一些选择器方法就不赘述了,列出来大家试一下应该就能明白了
lis = doc('div.content ul li')
#父节点,包含父节点的所有子孙节点的内容
#相当于
#print(doc('div.content ul'))
print(lis.parent())
#祖先节点,就相当于所有源代码了
print(lis.parents())
#兄弟节点,即同级节点,不包含自己
print(lis.siblings)
其他技巧
1.伪类选择器
如果想要每个版块的第一条小标题的话
#第二个标签
lis = doc('div.content li:nth-child(2)').items()
for i in lis:
print(i.text(),i('a').attr('href'))
第一个a标签的语法是 a:first-child,最后一个是a:last-child,其它位置的语法如上图所示,第几个括号里就是几(当然第一个你也可以写成 li:nth-child(1))
类似地,如果你想要只要小标题,也就是从第二个li开始到最后一个li
#div.content 下面第二个(含)之后的li标签
lis = doc('div.content li:gt(1)').items()
for i in lis:
print(i.text(),i('a').attr('href'))
gt就是greater than,大于的意思,lt (less than)是小于
还可以用伪类选择器来筛选文本
lis = doc('div.content ul').items()
for i in lis:
#文本包含问号的li标签
print(i("li:contains('?')").text())
[图片上传失败...(image-4378d9-1548221385522)]
2.修改标签属性
如果我只想要小标题,这里再介绍一种方法
从源代码来看,想要所有小标题就是要排除ul标签下面的第一个li标签,通过观察发现它的特点就是类名(class值)为content-article,而其它li标签没有,所以我们可以利用这点
[图片上传失败...(image-e3208f-1548221385522)]
#用remove把特定标签移除,然后再进行遍历
lis = doc('div.content ul').remove('.content-article').items()
for i in lis:
print(i.text())
PyQuery里还有一些方法,比如修改属性,增加css之类的一些使用率较低的就不介绍了,详情可参考pyquery官方文档的 PyQuery complete API
直接在Chrome里调试
其实我们的Chrome浏览器自带css的查询方法,按f12或者右键检查,打开Elements面板,按ctrl+f,
[图片上传失败...(image-1d0031-1548221385522)]
这里支持xpath,css语法,以及普通的字符查找
[图片上传失败...(image-b79f66-1548221385522)]
要注意的是右边的数字,显示的是满足条件的标签数量,可以按向下的箭头过一遍,看看是不是自己想要的信息。
稍微认真写一下就有这么多内容,看来这篇详解还是有点意义的,感谢观看!
公众号.jpg
python pyquery节点内所有文本_PyQuery详解相关推荐
- python __repr__方法_第8.13节 Python类中内置方法__repr__详解
当我们在交互环境下输入对象时会直接显示对象的信息,交互环境下输入print(对象)或代码中print(对象)也会输出对象的信息,这些输出信息与两个内置方法:__str__方法和__repr__方法有关 ...
- 【Python入门】Python 63个内置函数超级详解
Python内置了一些非常精巧且强大的函数,对初学者来说,一般不怎么用到,但是偶尔会碰到,我也是用了一段时间python之后才发现,卧槽,还有这么好的函数,每个函数都非常经典,而且经过严格测试,使用内 ...
- Python 63个内置函数超级详解
python内置了一些非常精巧且强大的函数,对初学者来说,一般不怎么用到,但是偶尔会碰到,我也是用了一段时间python之后才发现,卧槽,还有这么好的函数,每个函数都非常经典,而且经过严格测试,使用内 ...
- Python 63个内置函数超级详解!这63个必会!
python内置了一些非常精巧且强大的函数,对初学者来说,一般不怎么用到,但是偶尔会碰到,我也是用了一段时间python之后才发现,卧槽,还有这么好的函数,每个函数都非常经典,而且经过严格测试,使用内 ...
- 【Python基础】内置函数filter详解
filter,顾名思义,就是一个过滤器.其作用是从列表(或其他序列类型)中筛选出满足条件的子列表,filter是python的内置函数,无须import即可直接使用. 1 filter的基础用法 对于 ...
- python int函数详解_Python内置函数OCT详解
英文文档:oct ( x ) Convert an integer number to an octal string. The result is a valid Python expression ...
- python怎么重命名word文件,Python读取word文本操作详解
本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就 ...
- office是python打开方式_Python读取word文本操作详解
本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就 ...
- [转载] python支持complex吗_Python 内置函数complex详解
参考链接: Python complex() 英文文档: class complex([real[, imag]]) Return a complex number with the value re ...
最新文章
- 开启灯光就是近光吗_保时捷Macan大灯改装技术,东莞专业豪车灯光改装修复。保时捷改LED大灯...
- Data - 深入浅出学统计 - 上篇
- ROS建立URDF模型
- 【Windows 10 应用开发】使用快捷访问键
- 重温Observer模式--热水器·改(转载)
- SqlServer按时间自动生成生成单据编号
- mysql备份到制定目录_写一个脚本定时自动备份mysql到指定目录
- 人工智能之语音识别技术【科普】
- PHP泡泡龙源码,泡泡龙 游戏源码
- pyautogui获取鼠标位置及循环点击指定位置按钮
- mysql 分页 count 查询效率低下分析
- linux下RTNETLINK answers: File exists的解决方案 慎重
- h5 android 重力 晃动,H5案例分享:html5重力感应事件(示例代码)
- A1、A2、A3、A4纸都是多大尺寸
- 2021.3.14学习随笔
- Nginx关闭后,网页仍能访问(缓存问题)
- python爬虫 构建自己的代理IP池
- input表单所有属性【web前端】
- 基于AndroidStudio员工绩效考核评价系统app设计
- 浅谈缓存系统的三个问题