Xpath 使用技巧
简介
XPath:XML Path Language,一门在XML和HTML文档中查找信息的语言。
插件安装:
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')
备注
etree.parse方法中的parser参数可以传递解析器,如果不指定默认为XML解析器,如果遇到不规范的HTML代码导致解析错误,可以自己创建HTML解析器;- 获取文本通过
text()方法,获取属性通过@属性名方法; - 在某个标签下,再执行
xpath函数获取子元素,应该在斜杠前加一个.,代表是从当前元素下获取,如./a[@class="test"]。
参考
Xpath 使用技巧的更多相关文章
- xpath使用技巧
爬虫中我们对于元素的定位有多种方法,大致有: Beautifulsoup.Xpath和正则表达式三种方式 其中效率比较为: Beautifulsoup<Xpath<正则表达式 习惯了使用B ...
- 🔥《手把手教你》系列基础篇之4-python+ selenium自动化测试-xpath使用(详细教程)
1. 简介 俗话说:磨刀不误砍柴工,因此在我们要开始写自动化脚本之前,我们先来学习和了解几个基本概念,在完全掌握了这几个概念之后,有助于我们快速上手,如何去编写自动化测试脚本. 元素,在这个教程系列, ...
- 技术分享 | app自动化测试(Android)--高级定位技巧
原文链接 XPath高级定位技巧 XPath 简介 XPath 的英文全称为:XML Path Language,意旨对 XML 中的元素进行路径定位的一种语言,它可适用 XML 标记语言,Html ...
- selenium+python笔记1
#!/usr/bin/env python # -*- coding: utf-8 -*- """@desc: 讲讲web项目中常用的方法属性 webdriver 提供了 ...
- Java网络蜘蛛/网络爬虫 Spiderman
Spiderman - 又一个Java网络蜘蛛/爬虫 Spiderman 是一个基于微内核+插件式架构的网络蜘蛛,它的目标是通过简单的方法就能将复杂的目标网页信息抓取并解析为自己所需要的业务数据. 主 ...
- 18年selenium3+python3+unittest自动化测试教程(上)
第一章 自动化测试课程介绍和课程大纲 1.自动化测试课程介绍 简介:讲解什么是自动化测试和课程大纲讲解,课程需要的基础和学后的水平 python3.7+selenium3 pycharm 第二章自动化 ...
- selenium 定位
一 . chrome的调试工具 1)在chrome界面,按F12快捷键,弹出chrome的调试工具 2)找出登录按钮的id和username.password的id 二.XPath工具 安装 为了提 ...
- Python+Selenium基础篇之4-XPath的使用
开始写自动化脚本之前,我们先学习几个概念,在完全掌握了这几个概念之后,有助于我们快速上手,如何去编写自动化测试脚本. 元素,在这个教程系列,我们说的元素之网页元素(web element).在网页上面 ...
- selenium3+python3自动化测试学习之网页元素定位
selenium基础实战之定位网页元素技巧 selenium定位网页元素 find_element_by_id,find_element_by_name,find_element_by_class_n ...
随机推荐
- python有关于图像的深度和通道
目录: (一)图像的深度和图像的通道 (1)图像的深度 (2)图像的通道 (二)自定义一张多通道的图片 (1)zeros 函数 (2)ones 函数 (三)自定义一张单通道的图片 (四)像素操作 ...
- [hdu6598]Harmonious Army
网络流建图,首先将所有价值加起来,用最小割考虑要删掉多少个价值:源点向每一个士兵连流量为x的边,士兵向汇点连流量为y的边,每一对关系间连流量为z的边,考虑有方程x1+y2+z=x2+y1+z=a+c, ...
- [spojDIVCNT1]Counting Divisors
定义 约定1:以下分数都是最简,且令$\frac{1}{0}$有意义,其大于其余分数,并称平行于$y$轴的直线斜率为$-\frac{1}{0}$ 分数加:对于分数$a=\frac{a_{1}}{a_{ ...
- 状压DP详解+题目
介绍 状压dp其实就是将状态压缩成2进制来保存 其特征就是看起来有点像搜索,每个格子的状态只有1或0 ,是另一类非常典型的动态规划 举个例子:有一个大小为n*n的农田,我们可以在任意处种田,现在来描述 ...
- vue项目中使用 SheetJS / js-xlsx 导入文件
原表格样式; 导入效果: 1. 安装 npm install xlsx 2. 在App.vue 中引入xlsx import * as XLSX from 'xlsx'; // 数据导出导入所需要的 ...
- CF1368F Lamps on a Circle
思考我们一定有最后一个状态是空着的灯是按照一个间隔\(k\) 只要将原来\(n\)个灯,每\(k\)个分一组,强制将最后一盏灯不选,并且第n盏灯不选,需要注意的是某一组一定会被第二个人全部关掉,那么可 ...
- 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)
题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...
- 【Python小试】去除核酸特定长度的接头序列
输入 input.txt ATTCGATTATAAGCTCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATC ATTCGATTATAAGCACTGATCGATCGATCG ...
- Django结合Echarts在前端展示数据
前言 最近在用Django写UI自动化测试平台,基本快要弄完了,但是首页只有项目列表展示,一直感觉很空旷,所以想把一些关键数据在首页展示出来. 这时就想到利用Echarts这个开源项目,但是Djang ...
- Ubuntu apt代理apt-cacher-ng配置及使用
apt-cacher-ng是更强大的apt代理服务器的替代方案,例如squid-deb-proxy.如果您正在运行小型家庭或办公室网络,那就别无所求.它可能缺少一些更高级的功能,但是可以立即进行配置, ...