【python爬虫】xpath使用说明

XPath 可以在XML文档中查找信息,支持HTML,可以用来提取信息。可以把标签文本看作一个树状图,最顶层是html,第二层是head和body,body的下面是许多div,每个div可以用/[@属性=属性名]来进一步细分,也可以通过/@属性来获取对应的信息,提取双标签中的文字则可以用/text()。

安装库

pip3 install lxml

基本使用

from lxml import etree  
wb_data = """  <div>  <ul>  <li class="item-0"><a href="link1.html">first item</a></li>  <li class="item-1"><a href="link2.html">second item</a></li>  <li class="item-inactive"><a href="link3.html">third item</a></li>  <li class="item-1"><a href="link4.html">fourth item</a></li>  <li class="item-0"><a href="link5.html">fifth item</a>  </ul>  </div>  """  
html = etree.HTML(wb_data)  
print(html)  
result = etree.tostring(html)  
print(result.decode("utf-8"))

从下面的结果来看,这里的html其实就是一个python对象,etree.tostring(html)则补全了html缺胳膊少腿的标签。

输出结果:

<Element html at 0x39e58f0>  
<html><body><div>  <ul>  <li class="item-0"><a href="link1.html">first item</a></li>  <li class="item-1"><a href="link2.html">second item</a></li>  <li class="item-inactive"><a href="link3.html">third item</a></li>  <li class="item-1"><a href="link4.html">fourth item</a></li>  <li class="item-0"><a href="link5.html">fifth item</a>  </li></ul>  </div>  </body></html>

语法

选取节点

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式描述
nodename选取此节点的所有子节点。
/表示子级范围
//表示子孙后代范围
.选取当前节点。
选取当前节点的父节点。
@根据属性具体判断某一个标签,可以通过 标签名[属性值判断式] 来定位,

示例

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式结果
bookstore选取 bookstore 元素的所有子节点。
/bookstore选取元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。

谓语(Predicates)

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

顺序定位

  1. 方式一:[1]
    通配标签返回的是一个列表,里面为空或者一些元素。
    xpath支持取具体值, 例如去列表的第一个元素,[1]就可以拿到;第二个值就是[2]。
    注意列表的下角标从1开始,不像python那样从0开始
  2. 方式二:position()
    position函数会返回当前的位置值,拿到值之后就可以对值进行判断选取。
    举例: 选取当前位置下的所有div标签,然后去掉第一个,取出从2开始,一直到最后 一个div标签。
    .//div[position()>1]
  3. 方式三:last()
    这个是最简单的,就是取列表的最后一个元素
    举例:
    .//div[last()]

示例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position() < 3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=‘eng’]选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

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

示例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
//title[@*]选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

示例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
//book/title | //book/price选取 book 元素的所有 title 和 price 元素。
//title | //price选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

与或非

通过与或非进行更严格的筛选

逻辑 非 
关键字 andornot() 
示例 .//div[@id and @class] .//div[@id or @class] .//div[not(@id)] 
示例解释 同时拥有id和class属性的div有id或者class属性的div没有id属性的
div

常用函数

contains(属性名,值)

匹配包含对应值的标签或数据

response.xpath('//a[contains(text(),"Next >")]')
response.xpath('.//div[contains(@class,"content")]')

获取某个标签的内容(基本使用),注意,获取a标签的所有内容,a后面就不用再加正斜杠,否则报错。

text()

获取文本
写法一

html = etree.HTML(wb_data)
html_data = html.xpath('/html/body/div/ul/li/a')
print(html)
for i in html_data:print(i.text)

输出:

<Element html at 0x12fe4b8>
first item
second item
third item
fourth item
fifth item

写法二
直接在需要查找内容的标签后面加一个/text()就行

html = etree.HTML(wb_data)
html_data = html.xpath('/html/body/div/ul/li/a/text()')
print(html)
for i in html_data:print(i)

输出:

<Element html at 0x138e4b8>
first item
second item
third item
fourth item
fifth item

parse(html文件路径)

打开读取html文件

#使用parse打开html的文件
html = etree.parse('test.html')
html_data = html.xpath('//*')#打印是一个列表,需要遍历
print(html_data)
for i in html_data:print(i.text)

将文本转码

html = etree.parse('test.html')
html_data = etree.tostring(html,pretty_print=True)
res = html_data.decode('utf-8')
print(res)

示例

打印指定路径下a标签的属性

可以通过遍历拿到某个属性的值,查找标签的内容

html = etree.HTML(wb_data)
html_data = html.xpath('/html/body/div/ul/li/a/@href')
for i in html_data:print(i)

相对路径匹配

下面我们查找相对路径,例如,查找所有li标签下的a标签内容。

html = etree.HTML(wb_data)
html_data = html.xpath('//li/a/text()')
print(html_data)
for i in html_data:print(i)

打印:

['first item', 'second item', 'third item', 'fourth item', 'fifth item']
first item
second item
third item
fourth item
fifth item

使用相对路径,查找一下相对路径下li标签下的a标签下的href属性的值,注意,a标签后面需要双//。

html = etree.HTML(wb_data)
html_data = html.xpath('//li/a//@href')
print(html_data)
for i in html_data:print(i)

打印:

['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
link1.html
link2.html
link3.html
link4.html
link5.html

相对路径下跟绝对路径下查特定属性的方法类似,也可以说相同。

html = etree.HTML(wb_data)
html_data = html.xpath('//li/a[@href="link2.html"]')
print(html_data)
for i in html_data:print(i.text)

打印:

[<Element a at 0x216e468>]
second item

查找最后一个li标签里的a标签的href属性

html = etree.HTML(wb_data)
html_data = html.xpath('//li[last()]/a/text()')
print(html_data)
for i in html_data:print(i)

打印:

['fifth item']
fifth item

查找倒数第二个li标签里的a标签的href属性

html = etree.HTML(wb_data)
html_data = html.xpath('//li[last()-1]/a/text()')
print(html_data)
for i in html_data:print(i)

打印:

['fourth item']
fourth item

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

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

相关文章

Debezium日常分享系列之:重新选择列

Debezium系列之&#xff1a;重新选择列 一、介绍 仅 SQL 数据库连接器支持此后处理器。在某些情况下&#xff0c;由于某些源数据库的工作方式&#xff0c;当 Debezium 连接器发出更改事件时&#xff0c;该事件可能会排除特定列类型的值。例如&#xff0c;PostgreSQL 中的 TOA…

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…

Docker九 | Swarm mode

目录 Swarm基本概念 节点 服务和任务 创建Swarm集群 创建管理节点 增加工作节点 查看集群 部署服务 新建服务 查看服务 服务伸缩 增加服务 减少服务 删除服务 Swarm基本概念 节点 节点分为管理节点(manager)和工作节点(worker) 管理节点 管理节点用于Swarm集群的…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK里函数来获取相机当前数据吞吐量&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在NEOAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过NEOAPISDK获…

Django 学习教程-介绍与安装

系列 Django 学习教程-第一个 Django 应用-CSDN博客 介绍 Django 是一个高级 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。 它由经验丰富的开发人员构建&#xff0c;解决了 Web 开发的大部分麻烦&#xff0c;因此您可以专注于在编写应用程序时无需重新发…

自定义事件

自定义事件 自定义事件 AAA"fn1"&#xff1a;向子组件的事件池中注入AAA事件&#xff0c;方法是父组件的fn1 发布订阅&#xff1a;子组件某个操作把父组件中的某个方法执行了 参数可以传多个 $listeners* $listeners&#xff1a;事件池中的方法 { aaa:fn1, bbb:fn2 }…

RestClient操作索引库_创建索引库(二)

ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c; 通过http请求发送给ES。 官方文档地址: https://www.elastic.co/quide/en/elasticsearch/client/index.html 目录 一、初始化JavaRestClient 1.1.依赖引入 1.2.初始化…

关于k8s

Kubernetes&#xff08;通常被称为K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由Google开发&#xff0c;并于2014年发布为开源项目&#xff0c;现在由云原生计算基金会&#xff08;CNCF&#xff09;负责维护。 Kub…

JS-图片预览

方法一 用URL.createObjectURL()将一个file或Blob类型的对象转为UTF-16的字符串 objectURL URL.createObjectURL(Fileobject); URL.createObjectURL()静态方法会创建一个 DOMString&#xff0c;其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中…

java代码配置连接OPCUA

pom依赖如下 <dependency><groupId>org.eclipse.milo</groupId><artifactId>sdk-client</artifactId><version>0.6.9</version> </dependency><dependency><groupId>org.eclipse.milo</groupId><artifa…

举例说明计算机视觉(CV)技术的优势和挑战

高效性&#xff1a;计算机视觉技术可以处理大量的图像和视频数据&#xff0c;并快速地从中提取有用的信息。它可以在几秒钟内完成复杂的图像处理任务&#xff0c;而这些任务对于人类来说可能需要很长时间才能完成。精确性&#xff1a;计算机视觉技术可以准确地识别和分析图像中…

Mybatis枚举类型处理和类型处理器

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

C++ 具名要求-基本概念-指定该类型对象可以默认构造

指定该类型对象可以默认构造 要求 以下情况下&#xff0c;类型 T 满足可默认构造 (DefaultConstructible) &#xff1a; 给定 任意标识符 u&#xff0c; 下列表达式必须合法且拥有其指定的效果 表达式后条件T u对象 u 被默认初始化。T u{}对象 u 被值初始化或聚合初始化。…

MySQL之复合查询

目录 单表查询回顾 多表查询 自连接 子查询 在from子句中使用子查询 合并查询 单表查询回顾 在讲解多表查询前&#xff0c;我们先回顾一下单表查询&#xff0c;这是因为多表查询本质上依然是单表查询&#xff08;其原因在下文中讲解多表查询时再说明&#xff09;&#x…

【vue】Easy Player实现视频播放:

文章目录 一、效果&#xff1a;二、文档&#xff1a;三、实现&#xff1a;【1】安装插件&#xff1a;【2】引入js文件&#xff1a;【3】使用&#xff1a; 四、方法&#xff1a; 一、效果&#xff1a; 二、文档&#xff1a; GitCode - EasyPlayer.js npm-easydarwin/easyplayer…

uni-app 前后端调用实例 基于Springboot 下拉刷新实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

关于“Python”的核心知识点整理大全54

目录 18.4 创建其他网页 18.4.1 模板继承 1. 父模板 base.html 注意 2. 子模板 index.html 注意 18.4.2 显示所有主题的页面 1. URL模式 urls.py 2. 视图 views.py 3. 模板 topics.html 18.4.3 显示特定主题的页面 1. URL模式 urls.py 2. 视图 views.py 往…

Delphi6函数大全3-SysUtils.pas

Delphi6函数大全3-SysUtils.pas首部 function FindNext(var F: TSearchRec): Integer; $[SysUtils.pas功能 返回继续文件搜索说明 搜索成功则返回0参考 function Windows.FindNextFile例子 <参见FindFirst>━━━━━━━━━━━━━━━━━━━━━首部…

KFold解释和代码实现

KFold解释和代码实现 文章目录 一、KFold是什么&#xff1f;二、 实验数据设置2.1 实验数据生成代码2.2 代码结果 三、实验代码3.1 实验代码3.2 实验结果3.3 结果解释 四、总结 一、KFold是什么&#xff1f; 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff1a;每一行表示测…

【从浅到深的算法技巧】3.数组

1.1.5数组 数组能够顺序存储相同类型的多个数据。除了存储数据&#xff0c;我们也希望能够访问数据。访问数组中的某个元素的方法是将其编号然后索引。如果我们有N个值&#xff0c;它们的编号则为0至N-1。这样对于0到N-1之间任意的i,我们就能够在Java代码中用a[i]唯一地表示第i…