10.爬虫---XPath插件安装并解析爬取数据

10.XPath插件安装并解析爬取数据

    • 1.XPath简介
    • 2.XPath helper安装
    • 3.XPath 常用规则
    • 4.实例引入
      • 4.1 `//`匹配`所有节点`
      • 4.2 `/` 或 `//` 匹配`子节点`或`子孙节点`
      • 4.3 `..`或 `parent::`匹配`父节点`
      • 4.4 `@`匹配`属性`
      • 4.5 `text()`文本获取
      • 4.6 `@`属性获取
      • 4.7 属性多值匹配

1.XPath简介

XPath是一门在XML文档中查找信息的语言,它使用路径表达式来选取XML文档中的节点或者节点集。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力,允许开发者精确地定位XML文档中的元素、属性或节点集。

2.XPath helper安装

XPath Helper是一款专用于chrome内核浏览器的实用型爬虫网页解析工具

  • 下载地址:xpath helper下载地址
    在这里插入图片描述

在这里插入图片描述
下载后得到了后缀.crx 的一个文件,然后打开谷歌浏览器的设置—>拓展程序—>管理拓展程序
在这里插入图片描述
XPath_Helper2.0.2.crx文件鼠标左键 拖入拓展程序界面,然后添加拓展程序
在这里插入图片描述
XPath_Helper 就安装好了
在这里插入图片描述
在这里插入图片描述
XPath_Helper固定为快捷方式
在这里插入图片描述

3.XPath 常用规则

表 达 式描  述
nodename选取此节点的所有子节点
/从当前节点选取直接子节点
//从当前节点选取子孙节点
.选取当前节点
..选取当前节点的父节点
@选取属性
[] 表示谓词,用于筛选符合条件的节点

4.实例引入

在这里插入图片描述
在这里插入图片描述
复制后的XPath如下:

//*[@id="content"]/div/div[1]/div/div/table[1]/tbody/tr

把复制的XPath 粘贴到 XPath_Helper
在这里插入图片描述
上面的 xpath语法只匹配了一项这样的数据,接下来我们来匹配多项这样的数据,把角标去了得到下面匹配多项的语法

//*[@id="content"]/div/div/div/div/table/tbody/tr

在这里插入图片描述
这样就匹配到了多项这样的数据

我们用这部分代码来分析:

<tr class="item"><td width="100" valign="top"><a class="nbg" href="https://movie.douban.com/subject/34971728/" title="盟军敢死队"><img src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2908456064.webp" width="75" alt="盟军敢死队" class=""></a></td><td valign="top"><div class="pl2"><a href="https://movie.douban.com/subject/34971728/" class="">盟军敢死队/ <span style="font-size:13px;" class="">绝密型战 / 无限制军团(港)</span></a><p class="pl">2024-04-18(中国香港) / 2024-04-19(美国) / 2024-05-24(中国大陆) / 亨利·卡维尔 / 艾莎·冈萨雷斯 / 阿兰·里奇森 / 亚历克斯·帕蒂弗 / 赫洛·费因斯-提芬 / 巴布斯·奥卢桑莫昆 / 亨利·扎格 / 蒂尔·施威格 / 亨利·戈尔丁 / 加利·艾尔维斯 / 弗莱迪·福克斯...</p><div class="star clearfix"><span class="allstar35"></span><span class="rating_nums">7.1</span><span class="pl">(20708人评价)</span></div></div></td>
</tr>

使用之前,首先要确保安装好 lxml 库。如尚未安装,可以使用 pip3 来安装:

pip3 install lxml
from lxml import etree
text = '''
<tr class="item"><td width="100" valign="top"><a class="nbg" href="https://movie.douban.com/subject/34971728/" title="盟军敢死队"><img src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2908456064.webp" width="75" alt="盟军敢死队" class=""></a></td><td valign="top"><div class="pl2"><a href="https://movie.douban.com/subject/34971728/" class="">盟军敢死队/ <span style="font-size:13px;" class="">绝密型战 / 无限制军团(港)</span></a><p class="pl">2024-04-18(中国香港) / 2024-04-19(美国) / 2024-05-24(中国大陆) / 亨利·卡维尔 / 艾莎·冈萨雷斯 / 阿兰·里奇森 / 亚历克斯·帕蒂弗 / 赫洛·费因斯-提芬 / 巴布斯·奥卢桑莫昆 / 亨利·扎格 / 蒂尔·施威格 / 亨利·戈尔丁 / 加利·艾尔维斯 / 弗莱迪·福克斯...</p><div class="star clearfix"><span class="allstar35"></span><span class="rating_nums">7.1</span><span class="pl">(20708人评价)</span></div></div></td>
</tr>
'''
#方法一: 读取text 文本
html = etree.HTML(text) 
#方法二: 读取html文件
# html = etree.parse('./test.html', etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))
  • etree.HTML(text) 方法一: 读取text 文本
  • etree.parse('./test.html', etree.HTMLParser()) 法二: 读取html文件

经过这两种方法处理之后,节点标签被补全,并且还自动添加了 body、html 节点
结果:
在这里插入图片描述
好家伙,unicode 编码,还需要再转一次 unicode 转中文,用 html 模块下的 unescape 方法
修改后的代码:

from lxml import etree
import html
text = '''
<tr class="item"><td width="100" valign="top"><a class="nbg" href="https://movie.douban.com/subject/34971728/" title="盟军敢死队"><img src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2908456064.webp" width="75" alt="盟军敢死队" class=""></a></td><td valign="top"><div class="pl2"><a href="https://movie.douban.com/subject/34971728/" class="">盟军敢死队/ <span style="font-size:13px;" class="">绝密型战 / 无限制军团(港)</span></a><p class="pl">2024-04-18(中国香港) / 2024-04-19(美国) / 2024-05-24(中国大陆) / 亨利·卡维尔 / 艾莎·冈萨雷斯 / 阿兰·里奇森 / 亚历克斯·帕蒂弗 / 赫洛·费因斯-提芬 / 巴布斯·奥卢桑莫昆 / 亨利·扎格 / 蒂尔·施威格 / 亨利·戈尔丁 / 加利·艾尔维斯 / 弗莱迪·福克斯...</p><div class="star clearfix"><span class="allstar35"></span><span class="rating_nums">7.1</span><span class="pl">(20708人评价)</span></div></div></td>
</tr>
'''
htmls = etree.HTML(text)
result = etree.tostring(htmls).decode('utf-8')
print(html.unescape(result))

修改后的结果:
在这里插入图片描述

4.1 //匹配所有节点

html = etree.HTML(text)
result = html.xpath('//*')
print(result)

运行结果:

[<Element html at 0x14cfea8ef80>, <Element body at 0x14c8bdf7540>, <Element tr at 0x14c8be450c0>, <Element td at 0x14c8be44fc0>, <Element a at 0x14c8be45100>, <Element img at 0x14c8be451c0>, <Element td at 0x14c8be45340>, <Element div at 0x14c8be45440>, <Element a at 0x14c8be45400>, <Element span at 0x14c8be45180>, <Element p at 0x14c8be452c0>, <Element div at 0x14c8be45500>, <Element span at 0x14c8be45540>, <Element span at 0x14c8be45580>, <Element span at 0x14c8be455c0>]

这里使用 * 代表匹配所有节点,也就是整个 HTML 文本中的所有节点都会被获取。可以看到,返回形式是一个列表,每个元素是 Element 类型,其后跟了节点的名称,如 html、body、div、ul、li、a 等,所有节点都包含在列表中了

如果想获取所有 <span> 节点,示例如下:

html = etree.HTML(text)
result = html.xpath('//span')
print(result)

运行结果:

[<Element span at 0x29a110e7540>, <Element span at 0x29a111450c0>, <Element span at 0x29a11144fc0>, <Element span at 0x29a11145100>]

4.2 /// 匹配子节点子孙节点

  • 获取<td> 下的直接子节点
html = etree.HTML(text)
result = html.xpath('//td/a')
print(result)

结果:

[<Element a at 0x2522492f540>]

在这里插入图片描述

  • 获取<td> 下的子孙节点
html = etree.HTML(text)
result = html.xpath('//td//a')
print(result)

结果:

[<Element a at 0x21f6c4d7540>, <Element a at 0x21f6c535040>]

在这里插入图片描述

这里我们要注意 / 和 // 的区别,其中 / 用于获取直接子节点,// 用于获取子孙节点。

4.3 ..parent::匹配父节点

现在首先选中 width 属性为 100 的 td 节点,然后获取其父节点,再获取其 class 属性,相关代码如下:

html = etree.HTML(text)
result = html.xpath('//td[@width="100"]/../@class')
print(result)
html = etree.HTML(text)
result = html.xpath('//td[@width="100"]/parent::*/@class')
print(result)

结果:

['item']

在这里插入图片描述

4.4 @匹配属性

选取 class 为 rating_nums 的 span 节点,可以这样实现:

html = etree.HTML(text)
result = html.xpath('//span[@class="rating_nums"]')
print(result)

结果:

[<Element span at 0x280c13a8b80>]

在这里插入图片描述

4.5 text()文本获取

text 方法获取节点中的文本,接下来尝试获取前面 p 节点中的文本

html = etree.HTML(text)
result = html.xpath('//p[@class="pl"]/text()')
print(result)

结果:

['2024-04-18(中国香港) / 2024-04-19(美国) / 2024-05-24(中国大陆) / 亨利·卡维尔 / 艾莎·冈萨雷斯 / 阿兰·里奇森 / 亚历克斯·帕蒂弗 / 赫洛·费因斯-提芬 / 巴布斯·奥卢桑莫昆 / 亨利·扎格 / 蒂尔·施威格 / 亨利·戈尔丁 / 加利·艾尔维斯 / 弗莱迪·福克斯...']

在这里插入图片描述

4.6 @属性获取

我们知道用 text 方法可以获取节点内部文本,那么节点属性该怎样获取呢?其实还是用 @ 符号就可以。例如,我们想获取所有 a 节点的 href 属性,代码如下:

html = etree.HTML(text)
result = html.xpath('//a/@href')
print(result)

结果:

['https://movie.douban.com/subject/34971728/', 'https://movie.douban.com/subject/34971728/']

在这里插入图片描述

4.7 属性多值匹配

有时候,某些节点的某个属性可能有多个值,例如:
在这里插入图片描述

html = etree.HTML(text)
result = html.xpath('//div[@class="star"]')
print(result)

这里 HTML 文本中 div 节点的 class 属性有两个值 star 和 clearfix,此时如果还想用之前的属性匹配获取,就无法匹配了,此时的运行结果如下:

[]

这时就需要用 contains 方法了,代码可以改写如下:

html = etree.HTML(text)
result = html.xpath('//div[contains(@class, "star")]')
print(result)

这样通过 contains 方法,给其第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以完成匹配了
此时运行结果如下:

[<Element div at 0x1f696514e80>]

其他一些高级用法可参考
1.w3school: http://www.w3school.com.cn/xpath/xpath_axes.asp
2.Python爬虫杂记 - Xpath高级用法:https://www.jianshu.com/p/4fef4142b33f

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab|混合策略改进的蝴蝶优化算法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要对蝴蝶算法&#xff08;BOA&#xff09;进行改进&#xff0c;参考文献《基于改进蝴蝶优化算法的冗余机器人逆运动学求解》&#xff0c;有如下改进策略&#xff1a; 改进1&#xff1a;采用反向学习策…

手把手带你做一个自己的网络调试助手(1) - TCP服务器准备

程序设计流程图 TCP 服务器 ui界面搭建 Tcp服务器建立连接 - listen() connect() 1.在构造函数中进行如下初始化: 通过 QNetworkInterface 类的 allAddresses 这一API 获得可用IP地址&#xff08;包括IPv4 和 IPv6&#xff09; 然后通过QHostAddress类的 protocol 这一AP…

使用vite从0开始搭建vue项目

使用Vite从0开始创建vue项目 第一步&#xff1a;创建项目目录 mkdir vue-demo -创建目录 cd vue-demo --进入项目 npm init -y --生成package.json文件 第二步&#xff1a;安装vite、typescript--ts、vue、vitejs/plugin-vue--对单文件组件、热重载、生产优化的支持 pnpm…

“三夏”农忙:EasyCVR/EasyDSS无人机技术助推现代农业走向智能化

随着科技的飞速发展&#xff0c;无人机技术已经逐渐渗透到我们生活的方方面面。其中&#xff0c;无人机在农业领域的应用尤为引人注目。它们不仅提高了农业生产的效率&#xff0c;还为农民带来了更便捷、更智能的种植方式。 无人机在农业应用场景中&#xff0c;通过搭载各种设备…

【数据结构】 -- 堆 (堆排序)(TOP-K问题)

引入 要学习堆&#xff0c;首先要先简单的了解一下二叉树&#xff0c;二叉树是一种常见的树形数据结构&#xff0c;每个节点最多有两个子节点&#xff0c;通常称为左子节点和右子节点。它具有以下特点&#xff1a; 根节点&#xff08;Root&#xff09;&#xff1a;树的顶部节…

电脑回收站清空了怎么恢复回来?分享四个好用数据恢复方法

电脑回收站清空了还能恢复回来吗&#xff1f;在使用电脑过程中&#xff0c;很多小伙伴都不重视电脑的回收站,&#xff0c;有用的没用的文件都往里堆积。等空间不够的时候就去一股脑清空回收站。可有时候会发现自己还需要的文件在回收站里&#xff0c;可回收站已经被清空了……那…

YoloV9改进策略:主干网络篇|MobileNetV4主干替换YoloV9的BackBone(独家原创)

摘要 今年&#xff0c;轻量级王者MobileNetV4闪亮登场&#xff01;在我们这篇文章里&#xff0c;我们把MobileNetV4加入到了YoloV9中&#xff0c;对MobileNetV4的层数和卷积层核做了适当的修改&#xff0c;然后替换原有的BackBone。哈哈&#xff0c;你猜怎么着&#xff1f;效果…

基于JSP的医院远程诊断系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; JSP Servlet JSPBean 工具&#xff1a; IDEA/Eclipse、Navica…

UltraScale+系列模块化仪器,可以同时用作控制器、算法加速器和高速数字信号处理器

基于 XCZU7EG / XCZU4EG / XCZU2EG • 灵活的模块组合 • 易于嵌入的紧凑型外观结构 • 高性能的 ARM Cortex 处理器 • 成熟的 FPGA 可编程逻辑 &#xff0c;基于 IP 核的软件库 基于 Xilinx Zynq UltraScaleMPSoC 的 FPGA 技术&#xff0c;采用 Xilinx Zynq UltraScale&a…

Mysql基础进阶速成2

看着篇文章之前先看我的前一章&#xff1a;MySQL基础进阶速成1 函数&#xff1a; 每个字段使用一个函数&#xff1a;select 函数(字段名)from 表名 upper&#xff1a;将字符串中的字母大写 lower&#xff1a;将字符串中的字符小写 max&#xff1a;得到最大值 min&#xf…

嵌入式仪器模块:音频综测仪和自动化测试软件

• 24 位分辨率 • 192 KHz 采样率 • 支持多种模拟/数字音频信号的输入/输出 应用场景 • 音频信号分析&#xff1a;幅值、频率、占空比、THD、THDN 等指标 • 模拟音频测试&#xff1a;耳机、麦克风、扬声器测试&#xff0c;串扰测试 • 数字音频测试&#xff1a;平板电…

高考志愿填报:大学学什么专业比较好呢?

准高三一枚&#xff0c;比较迷茫&#xff0c;求推荐一些专业以后比较好就业&#xff0c;发展前景较好的。听说互联网行业比较吃香&#xff0c;有想过以后做运营这一块&#xff0c;但是不知道应该在大学选什么专业&#xff0c;求推荐吧&#xff01; 学什么专业好&#xff1f; 这…

Vitis HLS 学习笔记--global_array_RAM初始化及复位

目录 1. 简介 2. 示例代分析 2.1 源代码 2.2 URAM 不可用 2.3 代码功能解释 2.4 综合报告 2.4.1 顶层控制接口 2.4.2 软件 IO 信息 2.4.3 存储绑定 3. 对比两种 solution 3.1 solution_A 3.2 solution_B 4. 总结 1. 简介 在C程序中&#xff0c;数组是一种基本的…

LLM的基础模型8:深入注意力机制

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

在线按模板批量生成文本工具

具体请前往&#xff1a;在线按模板批量生成文本工具

URL的编码解码(一),仅针对ASCII码字符

用十六进制对特定字符编码&#xff0c;利用百分号标识搜索字符串解码十六进制字符。 (笔记模板由python脚本于2024年06月09日 18:05:25创建&#xff0c;本篇笔记适合喜好探寻URL的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free…

Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet)

Set集合 package SetDemo;import java.util.HashSet; import java.util.Iterator; import java.util.Set;public class SetDemo {public static void main(String[] args) {/*Set集合的特点&#xff1a;1.Set系列集合的特点&#xff1a;Set集合是一个存储元素不能重复的集合方…

Vue13-计算属性的简写

一、计算属性的简写 注意&#xff1a; 当计算属性只有get&#xff0c;没有set的时候&#xff0c;才能用简写形式&#xff01;&#xff01;&#xff01;

svn的使用

【图文详解】入职必备——SVN使用教程-CSDN博客 使用SVNBucket作为服务端,来辅助学习. 什么时候会产生冲突呢? 原本A,B,服务器的版本都一致,都是最新版. A修改文件m,向服务器提交 B修改文件m,向服务器提交,这时候出现了冲突 双击冲突的文件,手动修改

---java 抽象类 和 接口---

抽象类 再面向对对象的语言中&#xff0c;所以的对象都是通过类来描述的&#xff0c;但如果这个类无法准确的描述对象的 话&#xff0c;那么就可以把这个类设置为抽象类。 实例 这里用到abstract修饰&#xff0c;表示这个类或方法是抽象方法 因为会重写motifs里的show方法…