简介

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. Scrapy入门到放弃06:Spider中间件

    前言 写一写Spider中间件吧,都凌晨了,一点都不想写,主要是也没啥用...哦不,是平时用得少.因为工作上的事情,已经拖更好久了,这次就趁着半夜写一篇. Scrapy-deltafetch插件是在S ...

  2. dart系列之:dart中的异步编程

    目录 简介 为什么要用异步编程 怎么使用 Future 异步异常处理 在同步函数中调用异步函数 总结 简介 熟悉javascript的朋友应该知道,在ES6中引入了await和async的语法,可以方 ...

  3. List、ArrayList、迭代器、链表、Vector

    1.List接口中的常用方法. List是Collection接口的子接口.所以List接口中有一些特有的方法. void add(int index, Object element) Object ...

  4. Error occurred during initialization of VM Could not reserve enough space fo

    通过es的elasticsearch.bat 启动.发现错误:Error occurred during initialization of VM Could not reserve enough s ...

  5. ES6学习 第五章 正则的扩展

    前言 本章介绍正则的扩展.有些不常用的知识了解即可. 本章原文链接:正则的扩展 RegExp 构造函数 从 ES6 开始,如果RegExp构造函数第一个参数是一个正则对象,并且第二个标志存在且为标志参 ...

  6. HCNP Routing&Switching之组播技术-组播地址

    前文我们聊到了组播技术背景,单播.广播在点到多点应用中的问题,以及组播对比单播.广播在点到多点的网络环境中的优势.劣势,相关回顾请参考https://www.cnblogs.com/qiuhom-18 ...

  7. CF1264D1 Beautiful Bracket Sequence (easy version)

    考虑在一个确定的括号序列中,我们可以枚举中间位置,按左右最长延伸出去的答案计算. 我们很自然的思考,我们直接维护左右两边,在删除一些字符后能够延伸的最长长度. 我们设\(f_{i,j}\)为\(i\) ...

  8. 嵌入式Linux利用ppp实现4G模块联网

    https://blog.csdn.net/qq361294382/article/details/52136126 https://blog.csdn.net/qq361294382/article ...

  9. java面试题目偏基础

    一.JAVA基础篇-概念1.简述你所知道的Linux:Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网.云计算.智能手机(An ...

  10. Swift-技巧(十) Protocol 的灵活使用

    摘要 Protocol 是 Swift 中实现面向协议编程思想的重要部分.在使用过程中有遇到协议中声明的部分,但是在遵守部分不需要实现的,那么就需要使用 extension 参与进来,让 Protoc ...