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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【WP】猿人学13_入门级cookie

https://match.yuanrenxue.cn/match/13 抓包分析 抓包分析发现加密参数是cookie中有一个yuanrenxue_cookie 当cookie过期的时候&#xff0c;就会重新给match/13发包&#xff0c;这个包返回一段js代码&#xff0c;应该是生成cookie的 <script>document.cookie(y)(u)(a…

RocketMQ可视化界面安装

RocketMQ可视化界面安装 **起因&#xff1a;**访问rocketmq-externals项目的git地址&#xff0c;下载了源码&#xff0c;在目录中并没有找到rocketmq-console文件夹。 git下面文档提示rocketMQ的仪表板转移到了新的项目中&#xff0c;点击仪表板到新项目地址&#xff1b; 下载…

flutter封装日历选择器(单日选择)

简单封装&#xff1a; 引入库&#xff1a;table_calendar import package:generated/l10n.dart; import package:jade/utils/JadeColors.dart; import package:jade/utils/Utils.dart; import package:util/easy_loading_util.dart; import package:flutter/material.dart; im…

【Python报错】已解决ModuleNotFoundError: No module named ‘gensim’

成功解决“ModuleNotFoundError: No module named ‘gensim’”错误的全面指南 在Python编程中&#xff0c;尤其是进行文本挖掘和自然语言处理&#xff08;NLP&#xff09;时&#xff0c;gensim库是一个常用的工具&#xff0c;用于主题建模、文档相似度计算、词向量表示&#x…

泽众云真机-上线海外机型测试专栏

泽众云真机平台&#xff0c;2024上半年70机型升级&#xff0c;也包括热门的海外机型。 但是&#xff0c;运营客服反馈&#xff0c;用户找不到平台海外机型在哪里&#xff0c;我们发现海外机型排列位置有问题&#xff0c;用户不易发现。目前问题已解决&#xff0c;上线海外机型测…

应对800G以太网挑战:数据中心迁移

在过去几年中&#xff0c;云基础设施和服务的大规模使用推动了对更多带宽、更快速度和更低延迟性能的需求。交换机和服务器技术的改进要求布线和架构随之调整。因此&#xff0c;800G以太网对数据中心迁移的需求&#xff0c;特别是对速率&#xff08;包括带宽、光纤密度和通道速…

MySQL学习——选项文件的使用

MySQL 的许多程序都可以从选项文件&#xff08;有时也被称为配置文件&#xff09;中读取启动选项。选项文件提供了一种方便的方式来指定常用的选项&#xff0c;这样你就不必每次运行程序时都在命令行上输入这些选项。 要确定一个程序是否读取选项文件&#xff0c;你可以使用 -…

搭建高可用k8s

高可用只针对于api-server&#xff0c;需要用到nginx keepalived&#xff0c;nginx提供4层负载&#xff0c;keepalived提供vip(虚拟IP) 系统采用openEuler 22.03 LTS 1. 前期准备 因为机器内存只有16G&#xff0c;所有我采用3master 1node 1.1 修改主机配置&#xff08;所有节…

单投币的充电桩如何加装一个扫码模块

充电桩需要投币才能充电&#xff0c;可是现在的人们很少有带硬币的习惯&#xff0c;扫码成为了一个常规的手段。我们也会发现有的充电桩无法扫码&#xff0c;或者说扫码无效&#xff0c;那是因为充电桩没有安装扫码模块&#xff0c;那么充电桩该如何加装扫码模块。 首先将充电桩…

Podman和Docker的区别

Podman 和 Docker 都是用于容器化的工具&#xff0c;但它们在架构、安全性、容器编排以及一些设计理念上有显著的区别&#xff1a; 架构设计: Docker 使用客户端-服务器&#xff08;C/S&#xff09;架构&#xff0c;包含一个名为 dockerd 的守护进程&#xff0c;该进程以 root …

西门子学习笔记6 - TCP通讯

1、主站设置 1、添加两个PLC在网络组态进行链接在一起&#xff0c;使用tcp链接 2、设置主站IP地址为&#xff1a;192.168.1.1 3、添加TSEND_C功能块 4、设置功能块参数连接 5、设置如下所示&#xff08;连接参数设置&#xff09; 6、设置如下所示&#xff08;连接块参数设置&a…

【Text2SQL】评估 LLM 的 Text2SQL 能力

论文&#xff1a;Evaluating the Text-to-SQL Capabilities of Large Language Models ⭐⭐⭐⭐ arXiv:2204.00498 一、论文速读 本论文尝试了多种 prompt 结构&#xff0c;并且评估了他们在 Codex 和 GPT-3 上的表现。下面介绍这些 prompt 结构&#xff1a; 二、不同的 prom…

UI 自动化中的分层设计

以前的设计 在过去 UI 自动化测试领域有一个规范的设计模式是 page object 模式。 意思是测试用例不会直接定位页面元素&#xff0c; 而是把每一个页面封装成一个类。 在这个类中封装页面元素。 然后测试用例调用 page 类来操作页面元素完成测试用例。如下图&#xff1a; 以前…

Linuxftp服务001匿名登入

在Linux系统中搭建FTP&#xff08;File Transfer Protocol&#xff09;服务&#xff0c;可以让用户通过网络在服务器与其他客户端之间传输文件。它有几种登入模式&#xff0c;今天我们讲一下匿名登入。 操作系统 CentOS Stream9 操作步骤 首先我们先下载ftp [rootlocalhost…

刷爆leetcode第八期

题目一 设计循环队列 题目分析 这里直接看图 我们发现这里要求我们设计一个循环队列 这要怎么设计呢&#xff1f; 还是一样 我们先画图 我们首先假设只能储存四个数字 同学们看这张图能观察到什么呢&#xff1f; 是不是可以得到front 和 rear相等的时候整个队列为空 这里…

【微机原理及接口技术】中断系统

【微机原理及接口技术】中断系统 文章目录 【微机原理及接口技术】中断系统前言一、中断概述中断的基本概念中断处理过程 二、8086/8088中断系统中断类型中断响应过程中断向量表内部中断服务程序 总结 前言 本篇文章我们会讲到中断的概述&#xff0c;8086/8088中断系统。 一、…

Mysql疑难报错排查 - Field ‘XXX‘ doesn‘t have a default value

项目场景&#xff1a; 数据库环境 &#xff1a;mysql8; 工程使用&#xff1a;MyBatisPlus 表情况&#xff1a; 问题描述 某一个插入语句使用了 MyBatisPlus 的 save 方法&#xff0c;因为end_time1 end_time2都并没有值&#xff0c;所以在MyBatisPlus默认情况下&#xff0c;…

SQL优化系列-快速学会分析SQL执行效率(下)

1 show profile 分析慢查询 有时需要确定 SQL 到底慢在哪个环节&#xff0c;此时 explain 可能不好确定。在 MySQL 数据库中&#xff0c;通过 profile&#xff0c;能够更清楚地了解 SQL 执行过程的资源使用情况&#xff0c;能让我们知道到底慢在哪个环节。 知识扩展&#xff1…

强化用户登录接口:解决登录接口被攻击导致掉线卡顿!

一、引言 用户登录接口是任何Web应用的核心部分&#xff0c;它负责身份验证和授权流程。然而&#xff0c;这些接口也常常成为黑客攻击的目标&#xff0c;尤其是当涉及到动态请求处理时。动态请求通常指的是根据用户输入生成的请求&#xff0c;这为诸如SQL注入、XSS攻击和CSRF攻…

华为 2024 届实习校园招聘-硬件通⽤(大部分硬件技术工程师岗位适用)/单板开发——第四套

华为 2024 届实习校园招聘-硬件通⽤&#xff08;大部分硬件技术工程师岗位适用&#xff09;/单板开发——第四套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共12套&#x…