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

相关推荐

  • 安卓系统文件夹及其文件解析[通俗易懂]

    安卓系统文件夹及其文件解析[通俗易懂]安卓系统文件夹及其文件解析打开Android文件管理器,会发现里面数十个英文名称命名的文件夹罗列其中,很多功能我们可以从其名字上略有所知,内部大批量的文件却让我们有些一头雾水。这些文件是什么?有什么用?我们能不能删?这些都是我们脑中充满疑问的。现在将将An…

  • flutter 自定义播放器进度条

    flutter 自定义播放器进度条FijkPlayer第三方的一个视频播放器,这是一个大佬基于比利比利播放器封装的,有常用的API可自定义样式pub传送门默认的样式展示:自定义的样式展示:**使用:**fijkplayer:^0.8.4///声明一个FijkPlayerfinalFijkPlayerplayer=FijkPlayer();@overridevoidinitState(){///指定视频地址player.setDataSource(“ht…

  • mysql longtext,在MySQL中,当只需要TEXT时,LONGTEXT是否会浪费空间?[通俗易懂]

    mysql longtext,在MySQL中,当只需要TEXT时,LONGTEXT是否会浪费空间?[通俗易懂]TEXT[(M)][CHARACTERSETcharset_name][COLLATEcollation_name]ATEXTcolumnwithamaximumlengthof65,535(2^16−1)characters.Theeffectivemaximumlengthislessifthevaluecontainsmultibytec…

  • c++二分法查找_二分法查找python代码

    c++二分法查找_二分法查找python代码二分法:二分法应用条件:1)数组为有序数组。2)同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。区间的定义:区间的定义不同代码就不同。1)定义target在[left,right]区间while(left<=right)要使用<=,因为left==right是有意义的,所以使用<=。if(nums[middle]>target)right要赋值为middle-1,因为当前这个nums[mid

    2022年10月31日
  • ubuntu安装deb文件_ubuntu安装完deb后找不到

    ubuntu安装deb文件_ubuntu安装完deb后找不到下载deb包到找到下载目录sudodpkg-iXXX.deb如果提示没有依赖sudoapt-getinstall-f如果提示依赖下载源没有找到(404),请到systemsettings—software&updates—-ubuntusoftware的sourcecode勾选并设置downloadfromchina某源网站,再运行sudoapt-getinsta

  • Android触摸事件_wpf触摸屏点击事件

    Android触摸事件_wpf触摸屏点击事件&amp;lt;Buttonandroid:layout_width=&quot;wrap_content&quot;android:layout_height=&quot;wrap_content&quot;android:id=&quot;@+id/start&quot;android:text=&quot;开始&quot;/&amp;gt;

发表回复

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

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