简介

XPathXML Path Language,一门在XMLHTML文档中查找信息的语言。

插件安装:

Chrome浏览器插件安装:XPath Helper

火狐浏览器插件安装:try XPath

常见语法

选取节点

XPath使用路径表达式来选取XML文档中的节点(集)。

表达式 描述 示例
nodename 选取此节点的所有子节点 div
// 查找所有子元素 //div
/ 查找直接子元素 /div
. 选取当前节点 ./div
.. 选取当前节点的父节点 ../div
@ 选取某个节点的属性 div[@id]

谓语

谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。常见谓语表达式如下:

表达式 描述 备注
/div/div[1] 选取div下的第一个div元素 xpath下标是从1开始的
/div/div[last()] 选取div下的最后一个div元素
/div/div[position()>3] 选取div下的前两个div元素
//div[@id] 选取所有拥有id属性的div元素
//div[@id="10"] 选取所有id为10的div元素
//div[contains(@class, "price")] 选取所有class包含price的div元素 模糊匹配

通配符

*表示通配符

通配符 描述 示例 结果
* 匹配任意节点 /div/* 选取div下的所有子元素
@* 匹配节点中的任何属性 //div[@*] 选取所有带有属性的div元素

选取多个路径

通过在表达式中使用|运算符,可以选取多个路径。示例:

'//div[@class="financial"] | //div[@class="john"]'

运算符

在所有使用的谓词中或选取节点时,可以使用运算符精确的选取节点

运算符 描述 实例 返回值
| 计算两个节点 //div | //dd 返回所用拥有div和dd元素的节点集
+ 加法 6+4 10
- 减法 6-4 2
* 乘法 6*4 24
div 除法 8 div 2 4
= 等于 price=9 如果是,返回True,否则返回False
!= 不等于 price!=9 同上
< 小于 price<9 同上
>= 小于或等于 price<=9 同上
or price=9 or price=10 有一个为真则返回True
and price=9 and price=10 同为真则返回True
mod 计算除法的余数 5 mod 2 1

比如要选取一个div节点,它的class"financial"id"john",可以使用//div[@class="financail" and id="john"]表达式。在某些拥有同一属性名和内容的元素中选取某个元素比较有用。

其他用法

使用contains选取包含属性

# div节点包含某个字符串的父节点下的td子节点
'//div[contains(text(), "标签文字包含某个字符串"]/../td'

使用tostring()将对象转换为字符串

# 使用xpath定位一个节点
s = html.xpath('//*[@id="testid"]')[0]
# s此时为<Element div at 0x2b6ffc8>对象
# 还原这个对象为html字符串
s2 = etree.tostring(s)
# s2现为:'<div id="testid">\n\t\t<h2>ÕâÀïÊǸöС±êÌâ</h2>\n\t\t<ol>\n\t\t\t<li data="one">1</li>\n\t\t\t<li data="two">2</li>\n\t\t\t<li data="three">3</li>\n\t\t</ol>\n\t\t<ul>\n\t\t\t<li code="84">84</li>\n\t\t\t<li code="104">104</li>\n\t\t\t<li code="223">223</li>\n\t\t</ul>\n\t</div>\n\t'

使用starts-with

'//div[starts-with(@class, "text")]'

使用not排除属性

# 排除包含某个属性的节点
'//tbody/tr[not(@class)]'
# 排除包含一个或两个属性的节点
'//tbody/tr[not(@class or @id)]'

选取倒数第二个标签

# 定位语法: position()=last()-1

'//tr[@bgcolor="#FFFFFF"]/td[position()=last()-1]//a'

使用 normalize-space

# normalize-space 函数删除了前部和尾部的空格, 并且把连续的空格串替换为一个单一的空格

'//*[starts-with(normalize-space(text()), "数读《共建“一带一路”倡议:进展、贡献和展望")]'

选取某个节点的兄弟节点

使用 preceding-sibling选取之前的兄弟节点,following-sibling选取之后的兄弟节点,例如:

# 选取 class 为 prompt 的 div 节点前的所有 class 为 post 的同级 div 节点
r.xpath('//div[@class="prompt"]/preceding-sibling::div[@class="post"]') # 选取 class 为 prompt 的 div 节点后的第一个兄弟节点
r.xpath('//div[@class="prompt"]/following-sibling::div[1]')

根据节点名字选取

节点名字可使用 name() 变量获取:

# 选取 div 下所有不是 p 标签的标签
r.xpath('//div/*[name()!="p"]')

选取祖先节点

使用 ancestor::

# 选取文本为 “办公电话” 的标签的 td 祖先标签的父级标签下的第二个子 td 标签下的文字
r.xpath('string(//*[text()="办公电话"]/ancestor::td/../td[2])')

更多

参考:

lxml库的使用

lxml是一个HTML/XML的解析器,解析和提取网页中的数据。它和正则一样,也是通过C语言实现的,是一款高性能的解析器。

用法示例

from lxml import etree

# 对字符串进行解析,同response对象
text = "some web source text..."
html = etree.HTML(text)
# 此时information是一个列表对象(xpath函数返回的永远是一个列表),要选取具体的数据需要给出下标
information = html.xpath('//div[@id="john"]//text()')
# 打印第一个
print(information[0]) # 对网页文件进行解析
html_element = etree.parse('somefile.html')
html = etree.tostring(html_element, encoding='utf-8').decode('utf-8')

备注

  1. etree.parse方法中的parser参数可以传递解析器,如果不指定默认为XML解析器,如果遇到不规范的HTML代码导致解析错误,可以自己创建HTML解析器;
  2. 获取文本通过text()方法,获取属性通过@属性名方法;
  3. 在某个标签下,再执行xpath函数获取子元素,应该在斜杠前加一个.,代表是从当前元素下获取,如./a[@class="test"]

参考

  1. Python爬虫:Xpath语法笔记
  2. lxml官方文档
  3. 【爬虫】xpath高级用法
  4. lxml官方文档-pdf版

Xpath 使用技巧的更多相关文章

  1. xpath使用技巧

    爬虫中我们对于元素的定位有多种方法,大致有: Beautifulsoup.Xpath和正则表达式三种方式 其中效率比较为: Beautifulsoup<Xpath<正则表达式 习惯了使用B ...

  2. 🔥《手把手教你》系列基础篇之4-python+ selenium自动化测试-xpath使用(详细教程)

    1. 简介 俗话说:磨刀不误砍柴工,因此在我们要开始写自动化脚本之前,我们先来学习和了解几个基本概念,在完全掌握了这几个概念之后,有助于我们快速上手,如何去编写自动化测试脚本. 元素,在这个教程系列, ...

  3. 技术分享 | app自动化测试(Android)--高级定位技巧

    原文链接 XPath高级定位技巧 XPath 简介 XPath 的英文全称为:XML Path Language,意旨对 XML 中的元素进行路径定位的一种语言,它可适用 XML 标记语言,Html ...

  4. selenium+python笔记1

    #!/usr/bin/env python # -*- coding: utf-8 -*- """@desc: 讲讲web项目中常用的方法属性 webdriver 提供了 ...

  5. Java网络蜘蛛/网络爬虫 Spiderman

    Spiderman - 又一个Java网络蜘蛛/爬虫 Spiderman 是一个基于微内核+插件式架构的网络蜘蛛,它的目标是通过简单的方法就能将复杂的目标网页信息抓取并解析为自己所需要的业务数据. 主 ...

  6. 18年selenium3+python3+unittest自动化测试教程(上)

    第一章 自动化测试课程介绍和课程大纲 1.自动化测试课程介绍 简介:讲解什么是自动化测试和课程大纲讲解,课程需要的基础和学后的水平 python3.7+selenium3 pycharm 第二章自动化 ...

  7. selenium 定位

    一 . chrome的调试工具 1)在chrome界面,按F12快捷键,弹出chrome的调试工具 2)找出登录按钮的id和username.password的id  二.XPath工具 安装 为了提 ...

  8. Python+Selenium基础篇之4-XPath的使用

    开始写自动化脚本之前,我们先学习几个概念,在完全掌握了这几个概念之后,有助于我们快速上手,如何去编写自动化测试脚本. 元素,在这个教程系列,我们说的元素之网页元素(web element).在网页上面 ...

  9. selenium3+python3自动化测试学习之网页元素定位

    selenium基础实战之定位网页元素技巧 selenium定位网页元素 find_element_by_id,find_element_by_name,find_element_by_class_n ...

随机推荐

  1. X-MagicBox-820的luatOS之路连载系列4

    上次说到定位成功后,显示的数据准确性问题.专门查询了下我所在地区的经纬度信息. MagicBox的显示数据是这样的: 网络上查到的经纬度数据是这样的: 可以看出定位精度还可以,毕竟我这个查询的数据没有 ...

  2. [cf1379F]Chess Strikes Back

    考虑将$(2i-1,2j-1)$和$(2i,2j)$缩为一个点,记作$(i,j)$ 对于每一个点,只能选$(2i-1,2j-1)$或$(2i,2j)$(显然不能都选),而这样恰好为$nm$个,因此必须 ...

  3. [atARC098F]Donation

    贪心,一定在最后一次经过某节点时付出$b_{u}$,条件是付出后$W\ge \max(a_{i}-b_{i},0)$(同时也可以仅考虑这个限制,因为$W$在过程中不会增大) 假设"最后一次经 ...

  4. win10 如何查看本地连接的WIFI密码

    1 在状态栏右侧找到WIFI图标,右键WIFI图标,打开"网路和 Internet"设置 2 切换到 "状态"或"WLAN",找到" ...

  5. 如何删除一个win10的服务

    使用场景: 之前电脑玩腾讯qq微端游戏,后来卸载残留服务一直在后台占用系统资源.那么如何关闭这个服务呢. 1.首先 管理员运行--cmd.exe 2.打开任务管理器,找到服务名称,如果服务开启可以关闭 ...

  6. CF1562E Rescue Niwen!

    开始的时候只会一个\(O(n^2log)\) 即做出所有的\(n^2\)串,显然可以用\(SAM\)来进行这样一个排序,然后\(log\)做. 但这种题我们显然要找一些友好的性质: 我们发现字符串的比 ...

  7. CF1550D Excellent Arrays

    考虑每个数一定是这个形式: \(i + x,i - x\) 所以如果我们要构造一个最大的数组. 那一定是这样的形式: 有一半为\(i + x\),有一半\(i - x\) 那么我们发现每个数有这样一个 ...

  8. 洛谷 P3285 - [SCOI2014]方伯伯的OJ(平衡树)

    洛谷题面传送门 在酒店写的,刚了一整晚终于调出来了-- 首先考虑当 \(n\) 比较小(\(10^5\) 级别)的时候怎么解决,我们考虑将所有用户按排名为关键字建立二叉排序树,我们同时再用一个 map ...

  9. 学习资源 Docker从入门到实践 pdf ,docker基础总结导图

    学习资源 Docker从入门到实践 pdf ,docker基础总结导图 Docker从入门到实践 pdf 云盘地址:https://pan.baidu.com/s/1vYyxlW8SSFSsMuKaI ...

  10. vim ——批量注释

    1111. ctrl+v进入列编辑模式,在编辑模式中,在行间上下移动光标,选择需要编辑哪些行的对应的列,之后使用I(大写)进入列插入.插入注释符,按两次Esc退出列编辑模式即可实现多行注释 删除注释: ...