`

XPath基础笔记

阅读更多
Wiki 写道
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。

 

W3C网址: http://www.w3schools.com/XPath/

 

表示法

最常见的XPath表达式是路径表达式(XPath这一名称的另一来源)。路径表达式是从一个XML节点(当前的上下文节点)到另一个节点、或一组节点的书面步骤顺序。这些步骤以“/”字符分开,每一步有三个构成成分:

 

轴描述

节点测试(用于筛选节点位置和名称)

节点描述(用于筛选节点的属性和子节点特征)

一般情况下,我们使用简写后的语法。虽然完整的轴描述是一种更加贴近人类语言,利用自然语言的单词和语法来书写的描述方式,但是相比之下也更加罗嗦。

 

表示法三种

最简单的XPath如下:

/A/B/C

在这里选择所有符合规矩的C节点:C节点必须是B的子节点(B/C),同时B节点必须是A的子节点(A/B),而A是这个XML文档的根节点(/A)。此时的这种描述法类似于磁盘中文件的路径(URI),从盘符开始顺着一级一级的目录最终找到文件。

 

这里还有一个复杂一些的例子,包含了全部构成成分(请详细的看):

A//B/*[1]

此时选择的元素是:在B节点下的第一个节点(B/*[1]),不论节点的名称如何(*);而B节点必须出现在A节点内,不论和A节点之间相隔几层节点(//B);与此同时A节点还必须是当前节点的子节点(A,前边没有/)。

 

最后一个常用的例子,在所有节点下查找:

//A/B/C/*[2]

 

轴语法

在未缩写语法里,两个上述范例可以写为:

/child::A/child::B/child::C

child::A/descendant-or-self::B/child::node()[1]

在XPath的每个步骤里,通过完整的轴描述(例如:child或descendant-or-self)进行明确的指定,然后使用::,它的后面跟着节点测试的内容,例如上面范例所示的A以及node()。

 

XPath 轴

轴可定义相对于当前节点的节点集。

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

 

实例

例子 结果
child::book 选取所有属于当前节点的子元素的 book 节点。
attribute::lang 选取当前节点的 lang 属性。
child::* 选取当前节点的所有子元素。
attribute::* 选取当前节点的所有属性。
child::text() 选取当前节点的所有文本子节点。
child::node() 选取当前节点的所有子节点。
descendant::book 选取当前节点的所有 book 后代。
ancestor::book 选择当前节点的所有 book 先辈。
ancestor-or-self::book 选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点)
child::*/child::price 选取当前节点的所有 price 孙节点。

 

XPath 运算符

下面列出了可用在 XPath 表达式中的运算符:

运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有拥有 book 和 cd 元素的节点集
+ 加法 6 + 4 10
- 减法 6 - 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80

如果 price 是 9.80,则返回 true。

如果 price 是 9.90,则返回 false。

!= 不等于 price!=9.80

如果 price 是 9.90,则返回 true。

如果 price 是 9.80,则返回 false。

< 小于 price<9.80

如果 price 是 9.00,则返回 true。

如果 price 是 9.90,则返回 false。

<= 小于或等于 price<=9.80

如果 price 是 9.00,则返回 true。

如果 price 是 9.90,则返回 false。

> 大于 price>9.80

如果 price 是 9.90,则返回 true。

如果 price 是 9.80,则返回 false。

>= 大于或等于 price>=9.80

如果 price 是 9.90,则返回 true。

如果 price 是 9.70,则返回 false。

or price=9.80 or price=9.70

如果 price 是 9.80,则返回 true。

如果 price 是 9.50,则返回 false。

and price>9.00 and price<9.90

如果 price 是 9.80,则返回 true。

如果 price 是 8.50,则返回 false。

 

Xpath函数

有关数值的函数

名称 说明
fn:number(arg)

返回参数的数值。参数可以是布尔值、字符串或节点集。

例子:number('100')

结果:100

fn:abs(num)

返回参数的绝对值。

例子:abs(3.14)   结果:3.14

例子:abs(-3.14)   结果:3.14

fn:ceiling(num)

返回大于 num 参数的最小整数。

例子:ceiling(3.14)  结果:4

fn:floor(num)

返回不大于 num 参数的最大整数。

例子:floor(3.14)  结果:3

fn:round(num)

把 num 参数舍入为最接近的整数。

例子:round(3.14)  结果:3

 

有关字符串的函数

名称 说明
fn:string(arg)

返回参数的字符串值。参数可以是数字、逻辑值或节点集。

例子:string(314)  结果:"314"

  • fn:compare(comp1,comp2)
  • fn:compare(comp1,comp2,collation)

如果 comp1 小于 comp2,则返回 -1。如果 comp1 等于 comp2,则返回 0。如果 comp1 大于 comp2,则返回 1。(根据所用的对照规则)。

例子:compare('ghi', 'ghi')  结果:0

fn:concat(string,string,...)

返回字符串的拼接。

例子:concat('XPath ','is ','FUN!')  结果:'XPath is FUN!'

  • fn:substring(string,start,len)
  • fn:substring(string,start)

返回从 start 位置开始的指定长度的子字符串。第一个字符的下标是 1。如果省略 len 参数,则返回从位置 start 到字符串末尾的子字符串。

例子:substring('Beatles',1,4)  结果:'Beat'

例子:substring('Beatles',2)  结果:'eatles'

  • fn:string-length(string)
  • fn:string-length()

返回指定字符串的长度。如果没有 string 参数,则返回当前节点的字符串值的长度。

例子:string-length('Beatles')  结果:7

  • fn:normalize-space(string)
  • fn:normalize-space()

删除指定字符串的开头和结尾的空白,并把内部的所有空白序列替换为一个,然后返回结果。如果没有 string 参数,则处理当前节点。

例子:normalize-space(' The   XML ')  结果:'The XML'

fn:upper-case(string)

把 string 参数转换为大写。

例子:upper-case('The XML')  结果:'THE XML'

fn:lower-case(string)

把 string 参数转换为小写。

例子:lower-case('The XML')  结果:'the xml'

fn:contains(string1,string2)

如果 string1 包含 string2,则返回 true,否则返回 false。

例子:contains('XML','XM')  结果:true

fn:starts-with(string1,string2)

如果 string1 以 string2 开始,则返回 true,否则返回 false。

例子:starts-with('XML','X')  结果:true

fn:ends-with(string1,string2)

如果 string1 以 string2 结尾,则返回 true,否则返回 false。

例子:ends-with('XML','X')  结果:false

fn:substring-before(string1,string2)

返回 string2 在 string1 中出现之前的子字符串。

例子:substring-before('12/10','/')  结果:'12'

fn:substring-after(string1,string2)

返回 string2 在 string1 中出现之后的子字符串。

例子:substring-after('12/10','/')  结果:'10'

fn:matches(string,pattern)

如果 string 参数匹配指定的模式,则返回 true,否则返回 false。

例子:matches("Merano", "ran")  结果:true

 

更多函数请参考: http://www.w3school.com.cn/xpath/xpath_functions.asp

 

最后是我自己实际工作中使用过的XPath实例:

* //span[text()="webapps/"]/../.././span

* //bookstore/book[last()]

* /DocText/WithQuads/Page/Word[text()='July' and Quad/P1/@X > 90]

* record[field[@id='220' and @value='Red'] and field[@id='221' and @value='Large']]

* /Root//Person[contains(Blog,'cn') and contains(@ID,'01')]

* //tr[td[1][text()="hello"] and td[2][contains(text(), "512M")]]

* //td[text()="short_open_tag"]/following-sibling::td[1]

* //td[text()="short_open_tag"]/preceding-sibling::td[1]

* //td[starts-with(text(), "%s") and contains(text(), "disk:%sMB")]/following-sibling::td[2][contains(text(), "%s")]

* //a[text()='x222']/../following-sibling::td[8]/a[2]

 

看完前面部分,这些的含义应该很容易可以看懂了。恭喜你,基本的XPath已经没问题了!

 

本人博客已搬家,新地址为:http://www.pycoding.com/

分享到:
评论

相关推荐

    (官方)XPath教程

    XPath教程.CHM文件很可能包含了完整的XPath规范和实践指导,涵盖基础概念、语法、函数库和示例。pp.gif可能是一个相关的图片资源,比如XPath的图表或者示例图。develop_design_level说明.html可能是关于XPath在不同...

    课堂笔记.zip

    1. **元素定位**:在"selenium课堂笔记_元素定位.py"中,可能讲解了如何使用不同的定位策略,如ID、name、class_name、tag_name、link_text、partial_link_text、XPath和CSS选择器来找到页面上的HTML元素。...

    自己整理的Scrapy爬虫笔记

    Scrapy爬虫笔记是一份详细的爬虫开发笔记,涵盖了Scrapy框架的基础知识、requests库的使用、lxml解析器的应用、正则表达式的匹配等多方面的内容。本笔记将带领读者深入了解Scrapy爬虫的开发过程,掌握爬虫开发的基础...

    python 爬虫学习笔记

    Python 爬虫学习笔记涵盖了爬虫的基础知识、网络和前端基础、Requests 模块、请求头、GET 和 POST 请求、代理、Cookie 模拟登录、Quote 和 Unquote、登录和获取 Cookie、Post 和 Session、重试机制、JSON 和 ...

    网络爬虫基础 个人学习笔记

    4. **XPath与CSS选择器**:XPath是XML路径语言,也可用于HTML,用于选取节点。CSS选择器则是根据CSS规则选取元素,两者都用于高效地定位网页元素。 5. **异步请求**:为了提高爬虫效率,可以使用异步请求库如...

    达内corejava+Oracle+JDBC+XML笔记

    至于XML笔记,可能会讲解XML文档的结构、DTD和Schema验证、XPath表达式以及Java如何使用DOM、SAX或StAX解析XML文件。 通过深入学习这些笔记,你可以全面理解Java开发的基础,并掌握与数据库交互的关键技术,以及...

    python、selenium版本查看 xpath元素抓取随记(csdn)————程序.pdf

    总结,这篇笔记提供了检查Python和Selenium版本的基础步骤,以及使用XPath进行复杂元素定位的方法。熟悉这些操作对于进行有效的Web自动化测试至关重要,它能帮助你编写出更高效、更精确的测试脚本,提升测试覆盖率和...

    XML笔记+XSLT中文入门

    理解节点类型,如元素、属性、文本和命名空间,以及路径表达式和轴的概念,是使用XPath的基础。 在实际应用中,XSLT模板定义了如何根据输入XML生成输出。模式匹配用于选择要应用模板的XML节点,而模板规则定义了...

    XML资料大全--基础 语言 笔记课件

    本资料大全将深入浅出地介绍XML的基础知识,为初学者提供宝贵的入门资源。 1. XML的基本概念: - XML文档结构:XML文档由元素、属性、文本、注释等构成,其中元素是XML的核心,用于封装数据。 - 声明:每个XML...

    达内Java培训笔记 PDF

    这部分可能讨论了XML解析(DOM、SAX和StAX)、DTD和XSD验证、XPath查询以及XSLT转换。 这些笔记内容丰富,适合希望深入了解Java开发的学员。通过学习,开发者可以掌握从基础到高级的Java知识,为成为专业Java程序员...

    java视频教程.XML.课堂笔记

    本教程的课堂笔记详细记录了XML学习过程中的重要知识点,从基础概念到高级应用,对XML的掌握具有很高的指导价值。通过学习这些内容,开发者可以更好地理解和利用XML进行数据交换、配置存储及各种Web服务的构建。

    Web安全学习笔记.pdf

    笔记的核心部分是常见Web漏洞的攻防,包括SQL注入、XSS跨站脚本、CSRF跨站请求伪造、SSRF服务器端请求伪造、命令注入、目录穿越、文件读取、文件上传、文件包含、XML External Entity(XXE)攻击、模板注入、XPath...

    Spider:爬虫python3 (request,BeautifulSoup,xpath,re,Selenium,wordcloud等模块)

    若fork或star请注明来源note笔记爬虫介绍: 《爬虫基础学习(总结)》模块库: cookie&代理package/6wordcloud&jieba 词云功能包名作用数据获取request爬取网页数据 解析re正则表达式BeautifulSoupxpathxpath语法来...

    python爬虫个人笔记记录

    本笔记将围绕Python爬虫的基础知识、常用库、网络请求、网页解析、数据存储等方面进行详细介绍。 一、基础知识 1. HTTP与HTTPS:HTTP是互联网上应用最为广泛的一种网络协议,而HTTPS是在HTTP的基础上增加了SSL/TLS...

    XML DOM4J学习笔记

    本篇笔记将深入探讨XML DOM4J的学习要点。 一、XML基础知识 1. XML结构:XML文档由元素(Element)、属性(Attribute)、文本内容(Text)、注释(Comment)等组成。每个XML文档都有一个根元素,其他元素嵌套在根...

    python1903笔记 爬虫.zip

    "python1903笔记 爬虫.zip"这个压缩包文件很可能包含了一位学习者在2019年3月对Python爬虫技术的学习笔记,旨在帮助我们了解和掌握Python爬虫的基础知识和实践技巧。 1. **Python基础知识**:在学习Python爬虫之前...

    网络爬虫自学笔记共7页.pdf.zip

    这份自学笔记可能涵盖了爬虫的基础知识、实现原理以及一些实用技巧。 网络爬虫的核心知识点包括: 1. **HTTP/HTTPS协议**:爬虫首先需要理解HTTP和HTTPS协议,这是互联网上的主要通信协议,用来发送和接收数据。...

    python爬虫仓库,包括一些学习笔记,例如基础、简单的画图词云数据分析。主要还是爬虫.zip

    学会如何查找元素、提取文本、遍历DOM树,以及处理CSS选择器和XPath表达式。 5. **数据存储**:爬取的数据通常需要存储以便进一步分析。CSV和JSON是常用的数据交换格式。Python的csv模块可以方便地读写CSV文件,...

    爬虫笔记!!!!!!!!!!!!

    【爬虫笔记】是关于网络爬虫技术的学习记录,涵盖了爬虫的基础概念、核心技术以及实践应用等多个方面。网络爬虫,又称网页蜘蛛或网络机器人,是一种自动浏览互联网并抓取网页信息的程序。在信息技术日益发达的今天,...

    java学习笔记JDK6课件和课本代码

    本资源"java学习笔记JDK6课件和课本代码"是一个针对初学者和有一定基础的开发者的学习资料集合,它涵盖了JDK6版本的相关内容。 JDK6是Java历史上的一个重要版本,发布于2006年,引入了许多新特性,包括增强的Swing...

Global site tag (gtag.js) - Google Analytics