python pyquery节点内所有文本_PyQuery详解[通俗易懂]

python pyquery节点内所有文本_PyQuery详解[通俗易懂]在之前写的爬虫入门里,PyQuery一笔带过,这次详细地讲一下。为什么选择PyQuery?Python爬虫解析库,主流的有PyQueryBeautifulsoupScrapySelectors正则表达式。PyQuery和scrapySelectors都是基于lxml模块,而lxml和正则表达式都是C语言写的,只有Beautifulsoup是用纯Python编写的,所以在实测中,Beautifu…

大家好,又见面了,我是你们的朋友全栈君。

在之前写的爬虫入门里,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)

获取文本

例如你想要各个板块的名字

7eb136bbe317

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())

7eb136bbe317

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)]

要注意的是右边的数字,显示的是满足条件的标签数量,可以按向下的箭头过一遍,看看是不是自己想要的信息。

稍微认真写一下就有这么多内容,看来这篇详解还是有点意义的,感谢观看!

7eb136bbe317

公众号.jpg

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134170.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Mac virtualbox 共享文件夹

    Mac virtualbox 共享文件夹1.启动virtualbox,选中虚拟机,点击设置,点击共享文件夹;2.点击右侧按钮添加共享文件夹;3.选择共享文件夹路径(mac路径),自动挂载,固定分配两个勾选。4.VBoxGuestAdditions_5.0.0.iso下载地址http://download.virtualbox.org/virtualbox/5.0.0/5.启动VirtualBox,启动win7虚拟机,…

    2022年10月27日
  • SeasLog 与 monolog 日志系统的区别,SeasLog安装步骤[通俗易懂]

    SeasLog 与 monolog 日志系统的区别,SeasLog安装步骤

  • dropout和bagging_dropout总结「建议收藏」

    dropout和bagging_dropout总结「建议收藏」1.伯努利分布:伯努利分布亦称“零一分布”、“两点分布”。称随机变量X有伯努利分布,参数为p(02.dropout其实也是一种正则化,因为也把参数变稀疏(l1,原论文)和变小(l2,caffe实际实现)。只有极少的训练样本可用时,Dropout不会很有效。因为Dropout是一个正则化技术,它减少了模型的有效容量。为了抵消这种影响,我们必须增大模型规模。不出意外的话,使用Dropout时较佳…

  • C语言必背18个经典程序,2022年C语言必背100代码大全

    C语言必背18个经典程序,2022年C语言必背100代码大全对于c语言来说,要记得东西其实不多,基本就是几个常用语句加一些关键字而已。你所看到的那些几千甚至上万行的代码,都是用这些语句和关键词来重复编写的。只是他们逻辑功能不一样,那如何快速的上手C语言代码,建议多看多写,下面是小编整理的C语言必背18个经典程序。

  • 【Cover Letter 】SCI 投稿加分必备,手把手教你写 投稿Cover Letter

    【Cover Letter 】SCI 投稿加分必备,手把手教你写 投稿Cover LetterCoverLetter是我们投稿时,与手稿一同发送给编辑的投稿信。一封内容简洁的投稿信,会让编辑对你文章的第一印象加分不少。今天,我们一起来学习一下,一篇给文章加分的投稿信应该怎么写。投稿信的内容主要包含文章的标题、类型,没有一稿多投的声明,文章的主要内容及亮点,还有通讯作者的信息。敲黑板!一篇投稿信最重要的两点,是语言简洁和符合期刊标准。所以,要想写好投稿信,我们务必要了解各…

  • ExtJs自学教程(1):一切从API開始

    ExtJs自学教程(1):一切从API開始

    2021年12月14日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号