python爬虫之xpath入门

文章目录

    • 一、前言
      • 参考文档:
    • 二、xpath语法-基础语法
      • 常用路径表达式
      • 举例说明
    • 三、xpath语法-谓语
      • 表达式举例
      • 注意
    • 四、xpath语法-通配符
      • 语法
      • 实例
    • 五、选取多个路径
      • 实例
    • 六、Xpath Helper
      • 安装
      • 使用说明
      • 例子:
    • 七、python中 xpath 的使用
      • 安装xpath 的依赖包
      • xml节点的获取
      • xpath解析 html内容
        • 1. 以读取 html文件的方式进行解析
        • 2、对 html的内容进行解析

一、前言

XPATH(XML Path Language),它可以在 XML 和 HTML文档中对元素和属性进行查找和遍历。

  1. XPath 使用路径表达式来选取 XML 文档中的节点或节点集。
  2. 这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常类似。
  3. 使用chrome 插件选择标签时候,选中时,选中的标签会添加属性class=“xh-highlight”

参考文档:

基础语法:https://www.w3school.com.cn/xpath/index.asp
python使用 xpath:https://blog.csdn.net/q1246192888/article/details/123649072

二、xpath语法-基础语法

常用路径表达式

表达式说明
nodename选取此节点的所有子节点
/绝对路径,如果写在最前面则从根节点选取,否则是当前节点下的子节点
//相对路径, 从匹配选择的当前节点下的直接或间接节点,而不考虑他们的位置。
.当前节点,类似于 linux 的当前目录
当前节点的父节点,类似与 linux 的上一级目录
text()一个开闭标签之间的文本内容
@某个节点标签内的属性

举例说明

  • footer: 获取 footer 节点下的所有子节点
  • /title: 根节点下所有title 标签
  • //div:根节点下所有的div 标签
  • ./div[@class=test-class].text():当前节点下,属性class=test-class的所有div 的文本内容
  • ./div[@id=test-id]…//a.text(): 当前节点下,属性id=test-id的div的 所有上一级a 标签的文本内容

三、xpath语法-谓语

可以根据标签的属性值、下标等来获取特定的节点

谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。

表达式举例

路径表达式结果
//title[@lang=“eng”]选择lang 属性值为 eng 的所有 title元素
//bookstore/book[1]选取属于 bookstore 子元素的第一个book 元素
//bookstore/book[last()]选取属于 bookstore子元素的最后一个 book 元素
//bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素
//bookstore/book[position()>1]选择所有 bookstore 下面的 book元素,从第二个开始选择
//book/title[text()=‘Harry Potter’]选择所有 book下的title元素,仅仅选择文本为 Harry Potter 的 title 元素
//div[@id=“test-div-1”]/span选择 id="test-div-1"下的 div下的所有 span 节点
/bookstore/book[price>35]/title选取 bookstore元素的所有 title节点,且其中的 price 子节点的值必须大于35
//div[@id=“test-container”]/span/@class找到 id="test-container"的div下 的 span节点的所有class的值
//span[i>2000]找到所有 span 节点,且其中的 i子节点的text()大于2000
//div[span[2]>=9.4]找到所有的 div 节点,且子节点中第二个 span 的text()内容大于9.4
//div[contains(@id,“test_div_”)]找到所有 div节点,且id包含了"test_div_"
//div[@class=“pagination”]//span[contains(text(),“下一页”)]先找到class="pagination"的 div,再找其子节点span,且文本内容包下一页

注意

  • 只要涉及到条件的加[],只要涉及到加属性值加@
  • 凡事 /text(),/@ 加在最后,是取值,取的是前面 标签的属性值
  • text(),@ 加在[]中,则是修饰符,表示使用标签的属性名或属性值 来筛选节点,
  • xpath 的索引下标是从1开始
  • 常用函数 text()取标签之间的文本,contains(属性,“内容”)表示某节点属性包含的内容

四、xpath语法-通配符

xpath 的通配符用来选取未知的 html/xml 元素

语法

通配符说明
*匹配任何的元素节点
@*匹配任何属性节点
node()匹配任何类型的节点

实例

路径表达式说明
/bookstore/*选取bookstore节点下的所有子节点
//*选取文档中的所有文档
//tittle[@*]选取所有带有属性的 title元素

五、选取多个路径

通过 xpath 的运算符|,选取多个路径,表示多个路径的并集

实例

路径表达式说明
//book/title | //book/price选取 book元素下的所有title和 price元素
//title | //price选取文档中的所有title和 price元素
/bookstore/book/title | //price选取属于 bookstore节点下 book 节点下的所有 title节点 以及文档中所有的 price 元素

六、Xpath Helper

Xpath Helper是一个免费的 chrom插件,是用来方便调试 xpath 用的,可以提高效率,由日本的一名程序员开发,只是目前只有外网可以访问。
我是使用了CMYNetwork加速器 VPN通道来进行安装。当然往上免费的也可以下载到。

扩展链接地址
注:VPN节点最好选择美国的节点

安装

在这里插入图片描述

使用说明

  • 打开一个任意网站,百度贴吧为例,https://tieba.baidu.com/p/8940673717
  • 可以在浏览器的右上角点击图标按钮,或按下 Ctrl+Shift+X快捷键(mac os 上是 Command+Shift+X)就可以开启 xpath helper,如下图
    左侧区域显示的是 xpath 语法来筛选,右侧区域就来显示效果。
    在这里插入图片描述
  • 查找某一个或某一块节点元素的 xpath,可以按 Shift键,将鼠标移动到指定节点元素的位置就可以看到xpath了
    在这里插入图片描述
  • 也可以在右键—>检查,选择具体的节点,然后右键—>Copy—>Copy Xpath
    在这里插入图片描述
    将 copy的xpath复制到 xpath helper的查询框,就可以看结果是否正确了
    在这里插入图片描述

例子:

  • 以查看人工智能贴吧的某一条内容为例子:
<!--查看 class="d_post_content_main"节点下的 id="post_content_149887537934"节点的内容-->
//div[@class="d_post_content_main"]//div[@id="post_content_149887537934"]

在这里插入图片描述

  • 查看分页
    如下是来查找分页的 下一页的href的链接值
//div[@id="thread_theme_5"]//ul[@class="l_posts_num"]//a[text()="下一页"]/@href

在这里插入图片描述

七、python中 xpath 的使用

安装xpath 的依赖包

pip install lxml

xml节点的获取

源码上 xml 解析的源码,https://gitee.com/allen-huang/python/blob/master/crawler/do-parse/test_xml_xpath.py

  • xml 文件的内容
<?xml version="1.0" encoding="UTF-8" ?>
<root><head><title>xml的 xpath 测试</title></head><bookstore><book><title lang="zh">图解 HTTP 协议</title><price>59</price></book><book><title lang="zh">网络爬虫开发实战</title><price>139</price></book></bookstore>
</root>
  • xml的解析文本内容
def test_xml(self):tree = etree.parse('book.xml')# 获取 head 节点下的 title 节点的文本内容print(tree.xpath('head/title/text()'))# 获取 bookstore 节点下的 book 的内容for element in tree.xpath('//bookstore'):# 当前节点下的 book 节点的 title 节点的文本内容print(element.xpath('book/title/text()'))# 当前节点下的 book 节点的 price 节点的文本内容print(element.xpath('book/price/text()'))pass

在这里插入图片描述

  • xml的属性筛选
def test_xml_fromstring(self):"""加载 xml 字符串,筛选属性的所有 title 的节点内容@return:"""xml_str = """<root><head><title>xml的 xpath 测试</title></head><bookstore><book><title lang="zh">图解 HTTP 协议</title><price>59</price></book><book><title lang="zh">网络爬虫开发实战</title><price>139</price></book></bookstore></root>"""tree = etree.fromstring(xml_str)title_nodes = tree.xpath("//title[@lang='zh']")for node in title_nodes:print(node.text)price_nodes = tree.xpath("//price")for node in price_nodes:print(node.text)pass

在这里插入图片描述

xpath解析 html内容

解析 html的内容的源码地址:https://gitee.com/allen-huang/python/blob/master/crawler/do-parse/test_html_xpath.py

1. 以读取 html文件的方式进行解析

文件也一同放在码云上,book.html
读取一个html文档,需要是标准的html,对于标签不全的html,就会报错,而HTML()会修复html的标签

  • html文件的结构
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><title>豆瓣阅读</title>
</head>
<body>
<div class="bookstore-container"><ul class="bookstore-list"><li id="book-1" class="bookstore-item"><a href="https://read.douban.com/reader/ebook/52497819/" class="bookstore-cover"><div class="bookstore-info"><div class="title">Java高并发编程:多线程与架构设计</div><div class="author">王文君</div><div class="price">59.00</div><div class="score">8.7</div><div class="publisher">机械工业出版社</div></div></a></li><li id="book-2" class="bookstore-item"><a href="https://read.douban.com/reader/ebook/153139284/" class="bookstore-cover"><div class="bookstore-info"><div class="title">Java高并发编程详情</div><div class="author">王文君</div><div class="price">55.00</div><div class="score">8.2</div><div class="publisher">机械工业出版社</div></div></a></li><li id="book-3" class="bookstore-item"><a href="https://read.douban.com/reader/ebook/128052544/" class="bookstore-cover"><div class="bookstore-info"><div class="title">深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)</div><div class="author">周志明</div><div class="price">99</div><div class="score">9.4</div><div class="publisher">机械工业出版社</div></div></a></li></ul>
</div>
</body>
</html>
  • 单元测试中的前置操作,设置共用对象
def setUp(self):"""前置操作@todo 1.将一个html文件转化成html对象,etree.parse()默认只能读取一个标准的html文档,对于标签不全的html,需要加上etree.HTMLParser(),否则就会报错,而使用HTML()会修复html的标签@todo 2.将html字符串转化成html对象,并使用etree.HTML()读取@return:"""# 从本地文件中读取 book.html 文档,并使用标准的html解析器self.html_load = etree.parse("book.html", etree.HTMLParser())# 这里在末尾特意少了一个</li>,用来测试,最后是否自动补全self.html_str = """<div class="fruits-container"><ul><li class="item-0"><a href="apple.html">苹果</a></li><li class="item-1"><a href="orange.html">"橘子"</a></li><li class="item-inactive"><a href="banana.html"><span class="bold">香蕉</span></a></li><li class="item-1"><a href="pear.html">香梨</a></li><li class="item-0"><a href="strawberries.html">草莓</a></li><li class="item-0"><a href="pineapple.html">菠萝</a></ul></div>"""pass
  • 将 Element对象转为字符串
def test_tostring(self):"""获取 html中的最外层的div标签@return:"""html_div = self.html_load.xpath('//div[@class="bookstore-container"]')print(html_div)# 将 html对象转换成字符串是 bytes 类型,并且格式化输出,并进行解码print(etree.tostring(html_div[0], pretty_print=True, encoding="utf-8").decode())pass

在这里插入图片描述

  • 解析获取豆瓣读书的基本信息:

通过 xpath 将书的链接,书名,作者等存入到 mongodb 中

def test_load_file(self):"""获取 html中所有的li标签@return:"""html_li = self.html_load.xpath('//li[@class="bookstore-item"]')# 遍历 class="bookstore-item" 的所有li标签book_list = []for key, li in enumerate(html_li):# 获取当前li标签下的a标签的href属性url = li.xpath("./a/@href")# 获取当前li 标签下的 div=title的文本内容title = li.xpath(".//div[@class='title']/text()")# 获取当前 li 标签下的 div=author的文本内容author = li.xpath(".//div[@class='author']/text()")# 获取当前li 标签下的 div=price的文本内容price = li.xpath(".//div[@class='price']/text()")# 获取当前li 标签下的 div=score的文本内容score = li.xpath(".//div[@class='score']/text()")# 获取当前li 标签下的 div=publisher的文本内容publisher = li.xpath(".//div[@class='publisher']/text()")book_dict = {# "_id": key,  # 主键"url": Tools.get_list_element(url, 0),"title": Tools.get_list_element(title, 0),"author": Tools.get_list_element(author, 0),"price": Tools.get_list_element(price, 0),"score": Tools.get_list_element(score, 0),"publisher": Tools.get_list_element(publisher, 0)}book_list.append(book_dict)# 格式化打印数据pprint(book_list)# 将数据存入到 mongodb中res = MongoPool().test.bookstore.insert_many(book_list)print(res.inserted_ids)
  • 结果:
    在这里插入图片描述
  • mongo 的数据
    在这里插入图片描述
2、对 html的内容进行解析

这是直接使用 etree.HTML()进行分析,它一般是来解析来自远程响应的内容,并自带修复 html 标签的功能

  • html的结构
<div class="fruits-container"><ul><li class="item-0"><a href="apple.html">苹果</a></li><li class="item-1"><a href="orange.html">"橘子"</a></li><li class="item-inactive"><a href="banana.html"><span class="bold">香蕉</span></a></li><li class="item-1"><a href="pear.html">香梨</a></li><li class="item-0"><a href="strawberries.html">草莓</a></li><li class="item-0"><a href="pineapple.html">菠萝</a></ul></div>
  • 代码:
def test_parse_html(self):"""使用 etree.HTML() 解析 html 文档etree.HTML() 会修复 html 标签,并且将 html 转化成 html 对象@return:"""html = etree.HTML(self.html_str)print(etree.tostring(html, pretty_print=True, encoding="utf-8").decode())# 获取class=item-inactive的 标签最终的 text 内容text_list = html.xpath('//li[@class="item-inactive"]//text()')print(text_list)# 获取class=item-0 的最后一个标签的 text 内容itme0_last_text = html.xpath('//li[@class="item-0"][last()]//text()')print(itme0_last_text)# 获取class=item-1 的所有链接地址item1_href = html.xpath('//li[@class="item-1"]//a/@href')print(item1_href)# 查找所有class=bold 的标签,*所有标签bold_info = html.xpath('//*[@class="bold"]')# 将 bold_tag 转化成字符串print(etree.tostring(bold_info[0], pretty_print=True, encoding="utf-8").decode())print(bold_info[0].tag)pass

经过测试,打印出来的内容,自动补全为标准化 html
在这里插入图片描述
解析的结果:
在这里插入图片描述

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

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

相关文章

基于yolov2深度学习网络的人脸检测matlab仿真,图像来自UMass数据集

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 网络架构与特征提取 4.2 输出表示 4.3损失函数设计 4.4预测阶段 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 load yolov2.mat% 加载…

爱注讲台三尺案不辞长作“育花”人

—记邵阳市优秀班主任、新宁县优秀教师周芳平 教育是人与人心灵上最美妙的接触&#xff0c;只要用心体察&#xff0c;用情关注&#xff0c;每一位学生都会走向金光大道。 ---题记 “亲爱的妈妈&#xff0c;祝您节日快乐&#xff01;”2024年3月8日&#xff0c;一条从深圳华为…

28-3 文件上传漏洞 -白盒审计绕过

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、upload-labs 靶场的第7关 先进行代码审计 $is_upload = false; $msg = null; if (isset($_POST[submit])) {if (file_exists($UPLOAD_ADDR)) {$deny_ext = array(".php&…

Spring Boot:筑基

Spring Boot 前言概述使用 Intellij idea 快速创建 Spring Boot 项目注意事项 前言 在学习 Spring 、SpringMVC 、MyBatis 和 JPA 框架的过程中&#xff0c;了解到 SSM 框架为 Java Web 开发提供了强大的后端支持&#xff0c;JPA 框架则简化了数据库的操作。然而&#xff0c;S…

Cesium:按行列绘制3DTiles的等分线

作者:CSDN @ _乐多_ 本文将介绍如何使用 Cesium 引擎根据模型的中心坐标,半轴信息,绘制 3DTiles 对象的外包盒等分线。 外包盒是一个定向包围盒(Oriented Bounding Box),它由一个中心点(center)和一个包含半轴(halfAxes)组成。半轴由一个3x3的矩阵表示,这个矩阵是…

算法第三十一天-区域和检索【数组不可变】

区域和检索-数组不可变 题目要求 解题思路 为方便描述&#xff0c;把 n u m s nums nums 记作 a a a。 对于数组 a a a&#xff0c;定义它的前缀和 s [ 0 ] 0 s [ 1 ] a [ 0 ] s [ 2 ] a [ 0 ] a [ 1 ] ⋮ s [ i ] a [ 0 ] a [ 1 ] ⋯ a [ i − 1 ] ∑ j 0 i −…

x86 32 64 Arm这些听过但不懂,都是什么?是架构还是系统?一文梳理

x86 听过吗&#xff1f;64位操作系统知道吧 和x86什么关系32和64都是什么东西&#xff1f;曾经的我也一头雾水&#xff0c;今天我才来整理一下&#xff0c;惭愧惭愧&#xff01;今天带着沉重的心情来梳理一下学习内容吧 如果你很熟悉很了解计算机的话&#xff0c;应该知道&…

深度分析:社科赛斯——穿越市场周期二十二年的考研机构

近日&#xff0c;一份由有关部门发布的统计数据引发了广泛关注&#xff1a;在中国&#xff0c;中小企业的平均寿命仅有3.7年&#xff0c;而小微企业更是不到3年。这一数字凸显了中小企业所面临的挑战与困境。然而&#xff0c;在这个充满风险与变化的商业环境中&#xff0c;社科…

中霖教育:二级建造师证书好考吗?

在建筑行业&#xff0c;二级建造师资格认证相较于一级建造师资格&#xff0c;难度会低一些。考试科目共有三科&#xff0c;考生需要在连续两个年度内通过所有科目的考试才为通过。 对于具备建筑相关基础和实践经验的考生来说&#xff0c;二级建造师的考试难度会低一些。根据往…

30天拿下Rust之错误处理

概述 在软件开发领域&#xff0c;对错误的妥善处理是保证程序稳定性和健壮性的重要环节。Rust作为一种系统级编程语言&#xff0c;以其对内存安全和所有权的独特设计而著称&#xff0c;其错误处理机制同样体现了Rust的严谨与实用。在Rust中&#xff0c;错误处理通常分为两大类&…

KUKA机器人自动回原点程序

一、创建全局变量点 创建两个全局变量分别用于储存机器人的笛卡尔姿态与关节角姿态。 打开System文件夹中的config文件创建全局变量的点位。 在USER GROBALS用户自定义变量Userdefined variables下创建一个E6POS类型的点位&#xff0c;一个E6AXIS类型的点位。 二、创建回原点…

基于SpringBoot+Vue交通管理在线服务系统的开发(源码+部署说明+演示视频+源码介绍)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

React状态管理Mobx

1 https://zh.mobx.js.org/README.html 2 https://juejin.cn/post/7046710251382374413 3 https://cn.mobx.js.org/refguide/observable.html ​​mobx入门基础教程-慕课网​​ ​​Mobx学习 - 掘金​​ 十分钟入门 MobX & React ​​十分钟入门 MobX & React​​…

警惕!On Hold被踢,2本1区,5本Springer旗下,共8本SCI/SSCI被剔除!

毕业推荐 SSCI&#xff08;ABS一星&#xff09; • 社科类&#xff0c;3.0-4.0&#xff0c;JCR2区&#xff0c;中科院3区 • 13天录用&#xff0c;28天见刊&#xff0c;13天检索 SCIE&#xff1a; • 计算机类&#xff0c;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区…

农业气象站在农业生产中的应用—气象科普

农业气象站在农业生产中发挥着至关重要的作用。它能够有效监测和记录农田环境中的各类气象要素&#xff0c;为农民提供科学、准确的气象数据&#xff0c;帮助他们更好地掌握天气变化规律&#xff0c;从而合理安排农业生产活动。 首先&#xff0c;农业气象站能够实时提供温度、…

使用 Clojure 进行 OpenCV 开发简介

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;如何将OpenCV Java 与Eclipse结合使用 下一篇&#xff1a; OpenCV4.9.0在Android 开发简介 ​警告 本教程可以包含过时的信息。 从 OpenCV 2.4.4 开始&#xff0c;OpenCV 支持…

挑战设计极限!电路仿真软件成功案例大揭秘,助您圆梦创新之路

在电子设计领域&#xff0c;电路仿真软件扮演着至关重要的角色。它们不仅能够帮助工程师们模拟和分析电路的性能&#xff0c;还能够加速设计过程&#xff0c;降低成本&#xff0c;提高产品的质量和可靠性。今天&#xff0c;让我们一起挑战设计极限&#xff0c;揭秘电路仿真软件…

Java基础---反射

什么是反射&#xff1f; 反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问。 这么说可能比较抽象&#xff0c;可以简单理解为&#xff1a;反射就是一个人&#xff0c;可以把类里面的成员变量&#xff0c;成员方法&#xff0c;构造方法都获取出来。 并且可…

Springcloud智慧工地APP云综合平台源码 SaaS服务

目录 智慧工地功能介绍 一、项目人员 二、视频监控 三、危大工程 四、绿色施工 五、安全隐患 具体功能介绍&#xff1a; 1.劳务管理&#xff1a; 2.施工安全管理&#xff1a; 3.视频监控管理&#xff1a; 4.机械安全管理&#xff1a; 5.危大工程监管&#xff1a; …

ctf_show笔记篇(web入门---反序列化)

目录 反序列化 254&#xff1a;无用&#xff0c;是让熟悉序列化这个东西的 255&#xff1a;直接使$isViptrue 256&#xff1a;还是使用变量覆盖 257&#xff1a;开始使用魔法函数 258&#xff1a;将序列化最前面的过滤了&#xff0c;使用绕过 259: 这一题需要看writeup才…