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

news2024/11/9 3:55:27

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.coloradmin.cn/o/1794049.html

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

相关文章

让你工作效率飞起的五款软件

&#x1f31f; No.1&#xff1a;亿可达 作为一款自动化工具&#xff0c;亿可达被誉为国内版的免费Zaiper。它允许用户无需编程知识即可将不同软件连接起来&#xff0c;构建自动化的工作流程。其界面设计清新且直观&#xff0c;描述语言简洁易懂&#xff0c;使得用户可以轻松上…

一个可以自动生成随机区组试验的excel VBA小程序

在作物品种区域试验时&#xff0c;通常会采用随机区组试验设计&#xff0c;特制作了一个可以自动生成随机区组试验的小程序。excel参数界面如下&#xff1a; 参数含义如下&#xff1a; 1、生成新表的名称&#xff1a;程序将新建表格&#xff0c;用于生成随机区组试验。若此处为…

探索通信技术的未来:2024中国通信技术和智能装备产业博览会

探索通信技术的未来&#xff1a;2024通信技术产业专场 随着信息技术的飞速发展&#xff0c;通信技术已成为现代社会不可或缺的基础设施。2024年10月11日至13日&#xff0c;青岛将迎来一场通信技术的盛会——2024中国军民两用智能装备与通信技术产业博览会。本次博览会不仅将展…

调试线上资源文件失效问题

之前的老项目&#xff0c;突然报红&#xff0c;为了定位问题&#xff0c;使用注入和文件替换的方式进行问题定位&#xff01; 1.使用注入 但是刷新后就没有了&#xff0c;不是特别好用&#xff01; const jqScript document.createElement(script); jqScript.src https://…

视频推广短信:新时代的营销利器(视频短信XML接口示例)

随着移动互联网的普及&#xff0c;短信已经不再是简单的文字信息传递工具&#xff0c;而是逐渐演变为一种有效的推广手段。特别是当视频与短信结合时&#xff0c;它所带来的营销效率更是令人瞩目。 一、视频推广短信的特点 1.直观性&#xff1a;与传统的文字短信相比&#xf…

MySQL存储引擎的区别和比较

MyISAM存储引擎 MyISAM基于ISAM存储引擎&#xff0c;并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度&#xff0c;但不支持事务。 MyISAM主要特性有&#xff1a; 1、大文件&#xff08;达到63位文件长度&#x…

图片像素缩放,支持个性化自定义与精准比例调整,让图像处理更轻松便捷!

图片已经成为我们生活中不可或缺的一部分。无论是社交媒体的分享&#xff0c;还是工作文档的编辑&#xff0c;图片都扮演着至关重要的角色。然而&#xff0c;你是否曾经遇到过这样的问题&#xff1a;一张高清大图在上传时却受限于平台的大小要求&#xff0c;或者一张小图需要放…

PPT视频如何16倍速或者加速播放

有两种方式&#xff0c;一种是修改PPT本身&#xff0c;这种方式非常繁琐&#xff0c;不太推荐&#xff0c;还有一种就是修改视频本身&#xff0c;直接让视频是16倍速的视频即可。 如何让视频16倍速&#xff0c;我建议人生苦短&#xff0c;我用Python&#xff0c;几行代码&…

Kafka生产者消息异步发送并返回发送信息api编写教程

1.引入依赖&#xff08;pox.xml文件&#xff09; <dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.6.2</version> </dependency> </depende…

0基础学习区块链技术——推演猜想

大纲 去中心预防篡改付出代价方便存储 在《0基础学习区块链技术——入门》一文中&#xff0c;我们结合可视化工具&#xff0c;直观地感受了下区块的结构&#xff0c;以及链式的前后关系。 本文我们将抛弃之前的知识&#xff0c;从0开始思考和推演&#xff0c;区块链技术可能是如…

【必会面试题】快照读的原理

目录 前言知识点一个例子 前言 快照读&#xff08;Snapshot Read&#xff09;是数据库管理系统中一种特殊的读取机制&#xff0c;主要用于实现多版本并发控制&#xff08;MVCC, Multi-Version Concurrency Control&#xff09;策略&#xff0c;尤其是在MySQL的InnoDB存储引擎中…

hadoop疑难问题解决_NoClassDefFoundError: org/apache/hadoop/fs/adl/AdlFileSystem

1、问题描述 impala执行查询&#xff1a;select * from stmta_raw limit 10; 报错信息如下&#xff1a; Query: select * from sfmta_raw limit 10 Query submitted at: 2018-04-11 14:46:29 (Coordinator: http://mrj001:25000) ERROR: AnalysisException: Failed to load …

关于一些优化的知识

1、凸优化&#xff1a;一定可找到全局最优解 非凸优化&#xff1a;一般是局部最优解 2、无约束优化问题求解方法&#xff1a;梯度下降、拟牛顿法、高斯牛顿法、LM算法 3、 解释&#xff0c;就是右边的式子对应于就是当前这个xk这个点基础上朝着pk取走步长为a得到了对应的值&…

什么是Vector Database(向量数据库)?

什么是Vector Database(向量数据库)&#xff1f; 向量数据库是向量嵌入的有组织的集合&#xff0c;可以随时创建、读取、更新和删除。向量嵌入将文本或图像等数据块表示为数值。 文章目录 什么是Vector Database(向量数据库)&#xff1f;什么是嵌入模型(Embedding Model)&…

618精选好物盘点!五款必买力作合集,省钱又实用!

随着夏日的脚步越来越近&#xff0c;618购物节也如期而至&#xff0c;成为消费者们期待的年度购物盛宴。在这个全民狂欢的日子里&#xff0c;各种精选好物层出不穷&#xff0c;无论是追求高品质生活的你&#xff0c;还是希望提升日常效率的上班族&#xff0c;都能在这一天找到心…

【微服务】使用kubekey部署k8s多节点及kubesphere

kubesphere官方部署文档 https://github.com/kubesphere/kubesphere/blob/master/README_zh.md kubuctl命令文档 https://kubernetes.io/zh-cn/docs/reference/kubectl/ k8s资源类型 https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E8%B5%84%E6%BA%90%E7%B1%BB%E5%9E…

QT_UI设计

mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE //命名空间 namespace Ui { class MainWindow; } //ui_MainWindow文件里定义的类&#xff0c;外部声明 QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_O…

读书笔记-《软件定义安全》之一:SDN和NFV:下一代网络的变革

第1章 SDN和NFV&#xff1a;下一代网络的变革 1.什么是SDN和NFV 1.1 SDN/NFV的体系结构 SDN SDN的体系结构可以分为3层&#xff1a; 基础设施层由经过资源抽象的网络设备组成&#xff0c;仅实现网络转发等数据平面的功能&#xff0c;不包含或仅包含有限的控制平面的功能。…

debian支持中文

1. 安装依赖 apt-get install locales2. 设置字符集 dpkg-reconfigure locales 选择en_us.UF-8&#xff0c;其余全部取消 3.设置生效&#xff0c;无需重启系统 source /etc/default/locale 4. 查看是否生效 locale

高效内容分发:海外短剧推广平台的流媒体传输技术挑战与解决

随着海外短剧市场的蓬勃发展&#xff0c;如何高效地将短剧内容分发给全球观众成为了推广平台必须面对的一大挑战。在这一过程中&#xff0c;流媒体传输技术起着至关重要的作用。然而&#xff0c;由于网络环境的复杂性和多样性&#xff0c;流媒体传输面临着带宽限制、延迟等诸多…