xpath的语法

本文深入探讨了XPath作为XML查询语言的功能与应用,通过实例展示了如何利用XPath选择、定位及筛选XML文档中的特定节点,包括绝对路径、相对路径、属性选择、元素选择等基本语法与高级用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XPathXML的查询语言,和SQL的角色很类似。以下面XML为例,介绍XPath的语法。

 
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
 <cd country="USA">
 <title>Empire Burlesque</title>
 <artist>Bob Dylan</artist>
 <price>10.90</price>
 </cd>
 <cd country="UK">
 <title>Hide your heart</title>
 <artist>Bonnie Tyler</artist>
 <price>9.90</price>
 </cd>
 <cd country="USA">
 <title>Greatest Hits</title> 
<artist>Dolly Parton</artist> 
<price>9.90</price> 
</cd>
</catalog>
 
 
 
 

定位节点
XML
是树状结构,类似档案系统内数据夹的结构,XPath也类似档案系统的路径命名方式。不过XPath是一种模式(Pattern),可以选出XML档案中,路径符合某个模式的所有节点出来。例如要选catalog底下的cd中所有price元素可以用:

 
 
/catalog/cd/price 
 
 

如果XPath的开头是一个斜线(/)代表这是绝对路径。如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。以下的语法会选出文件中所有叫做cd的元素(在树中的任何层级都会被选出来):

 
 
//cd
 
 

选择未知的元素
使用星号(Wildcards,*)可以选择未知的元素。下面这个语法会选出/catalog/cd的所有子元素:

 
 
/catalog/cd/*
 
 

以下的语法会选出所有catalog的子元素中,包含有price作为子元素的元素。

 
 
/catalog/*/price
 
 

以下的语法会选出有两层父节点,叫做price的所有元素。

 
 
/*/*/price
 
 

以下的语法会选择出文件中的所有元素。

 
 
//*
 
 

要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。

选择分支
使用中括号可以选择分支。以下的语法从catalog的子元素中取出第一个叫做cd的元素。XPath的定义中没有第0元素这种东西。

 
 
/catalog/cd[1]
 
 

以下语法选择catalog中的最后一个cd元素:(XPathj并没有定义first()这种函式喔,用上例的[1]就可以取出第一个元素。

 
 
/catalog/cd[last()]
 
 

以下语法选出含有price子元素的所有/catalog/cd元素。

 
 
/catalog/cd[price]
 
 

以下语法选出price元素的值等于10.90的所有/catalog/cd元素

 
 
/catalog/cd[price=10.90]
 
 

以下语法选出price元素的值等于10.90的所有/catalog/cd元素的price元素

 
 
/catalog/cd[price=10.90]/price
 
 

选择一个以上的路径
使用Or操作数(|)就可以选择一个以上的路径。例如:

 
 
/catalog/cd/title | catalog/cd/artist
 
 

选择所有title以及artist元素

 
 
//title | //artist
 
 

选择所有title以及artist以及price元素

 
 
//title | //artist | //price
 
 

选择属性
XPath中,除了选择元素以外,也可以选择属性。属性都是以@开头。例如选择文件中所有叫做country的属性:

 
 
//@country
 
 

选择所有含有country这个属性的cd元素:

 
 
//cd[@country]
 
 

以下语法选择出含有属性的所有cd元素

 
 
//cd[@*]
 
 

以下语法选择出country属性值为UKcd元素

 
 
//cd[@country='UK']
 
 
出处:http://www.cnblogs.com/jianjialin/archive/2009/02/01/1382056.html
<think>首先,用户的问题是关于XPath语法的学习和查询,具体是“XPath语法教程及使用示例”。我需要根据系统级指令来构建我的回答。系统级指令的关键点:-所有行内数学表达式必须使用$...$格式,但XPath不涉及数学表达式,所以这可能不适用。-独立公式必须使用$$...$$格式,但同样,XPath不是数学公式。-LaTeX语法正确:确保任何LaTeX使用正确,但XPath可能不需要。-使用中文回答:整个回答必须用中文。-生成相关问题:在回答末尾添加相关问题。-引用段落末尾添加引用标识:例如[^1],基于提供的引用内容。-回答结构清晰:帮助用户逐步解决问题,保证真实可靠。-参考站内引用:用户提供了三个引用:[^1]、[^2]、[^3],我需要整合这些到回答中。用户提供的引用:-[^1]:XPath语法详解,包括路径表达式如/,//,.,@。-[^2]:XPath在爬虫中的使用,使用lxml库解析HTML。-[^3]:XPath命名空间的使用,例如在Python中声明命名空间。用户的上一次问题:用户说“我想学习或查询XPath语法的使用”,所以我需要提供一个教程和示例。回答结构:1.**引言**:简要介绍XPath是什么。2.**核心概念**:解释XPath语法,如路径表达式、轴、谓语等。3.**使用示例**:提供实际代码示例,特别是基于引用[^2]和[^3]。4.**引用整合**:在相关段落末尾自然地添加引用标识。5.**总结**:简要总结。6.**相关问题**:生成相关问题。逐步构建回答:-**引言**:XPath是一门在XML文档中查找信息的语言。它用于导航XML元素和属性。-**核心概念**:-路径表达式:解释/,//,.,@。-基于引用[^1],添加引用。-**使用示例**:-使用lxml解析HTML,如引用[^2]。-命名空间处理,如引用[^3]。-**代码示例**:提供Python代码片段,展示如何使用XPath。-**总结**:强调XPath的应用场景。-**相关问题**:生成3-5个相关问题。确保真实可靠:基于提供的引用和通用知识。引用[^1]、[^2]、[^3]是给定的,所以我必须使用它们。生成相关问题:类似于示例中的快速排序问题,例如:1.XPath如何用于XML文档?2.如何在Python中使用XPath进行网页爬虫?3.XPath的常见错误和调试方法?4.XPath2.0与XPath1.0的区别?5.XPath与CSS选择器的比较?最终回答用中文。</think>### XPath 语法教程及使用示例 XPath(XML Path Language)是一门专门用于在 XML 文档中查找和导航信息的语言。它通过路径表达式选择元素或属性,广泛应用于数据提取、网页爬虫和 XML 处理中。下面我将逐步介绍 XPath 的核心语法,并提供实际使用示例,确保内容基于可靠引用并易于理解。 #### 1. **XPath 核心语法** XPath 语法基于路径表达式,类似于文件系统路径。关键语法元素包括: - **`/`**:从根节点开始选取元素(例如:`/bookstore/book` 选取根元素下的所有 book 元素)。 - **`//`**:从任意位置选取匹配节点,不考虑层级(例如:`//title` 选取文档中所有 title 元素)[^1]。 - **`.`**:代表当前节点(例如:`./price` 从当前节点选取 price 子元素)。 - **`@`**:选取属性(例如:`//book/@id` 选取所有 book 元素的 id 属性)[^1]。 - **谓语(Predicates)**:用于过滤节点,写在方括号中(例如:`//book[price>35]` 选取价格大于 35 的 book 元素)。 - **通配符**:如 `*` 匹配任何元素节点(例如:`//book/*` 选取 book 的所有子元素)。 这些表达式组合使用,可以精确定位 XML 或 HTML 中的内容。XPath 还支持函数(如 `text()` 获取文本内容)和轴(如 `ancestor::` 选取祖先节点),但以上是基础核心。 #### 2. **XPath 使用示例** 以下示例基于常见应用场景,使用 Python 的 `lxml` 库(一种流行的 XML/HTML 解析工具)实现。代码基于引用[^2]和[^3]的实践方法。 ##### 示例 1: 解析 HTML 文档(网页爬虫) 假设你从网页获取了 HTML 字符串,需要提取特定元素。以下代码演示如何使用 XPath 提取所有 `div` 元素: ```python from lxml import etree # 假设 html_str 是爬虫获取的 HTML 文本(unicode 字符串) html_str = ''' <html> <body> <div class="col1 old-style-col1"> <div>Item 1</div> <div>Item 2</div> </div> </body> </html> ''' # 解析 HTML 并应用 XPath html = etree.HTML(html_str) # 将字符串转为可解析对象 div_list = html.xpath("//div[@class='col1 old-style-col1']/div") # 选取指定 class 的 div 下的所有 div 元素 # 输出结果 for div in div_list: print(div.text) # 输出: Item 1, Item 2 ``` - **解释**:XPath 表达式 `//div[@class='col1 old-style-col1']/div` 表示: - `//div`:从任意位置选取 div 元素。 - `[@class='col1 old-style-col1']`:谓语过滤,只选 class 属性为 'col1 old-style-col1' 的 div。 - `/div`:选取其下的直接 div 子元素。 此方法常用于爬虫数据提取[^2]。 ##### 示例 2: 处理 XML 命名空间 当 XML 文档使用命名空间时,需在 XPath 中声明。以下代码展示如何在 Python 中处理: ```python from lxml import etree # 假设 XML 文档包含命名空间 xml_str = ''' <abc:books xmlns:abc="http://example.com/books"> <abc:book> <abc:title>XPath Guide</abc:title> </abc:book> </abc:books> ''' # 解析 XML 并声明命名空间 tree = etree.fromstring(xml_str) namespaces = {'abc': 'http://example.com/books'} # 定义命名空间映射 # 应用 XPath 提取标题 result = tree.xpath('//abc:book/abc:title', namespaces=namespaces) for title in result: print(title.text) # 输出: XPath Guide ``` - **解释**:命名空间 `abc` 映射到 URI,XPath 表达式 `//abc:book/abc:title` 在指定命名空间下选择元素。这在处理复杂 XML(如 SOAP 或 RSS 源)时常见[^3]。 #### 3. **常见应用场景与注意事项** - **应用场景**: - 网页爬虫:提取 HTML 中的数据(如示例 1)。 - XML 处理:查询和修改 XML 文档(如配置解析)。 - 数据转换:在 XSLT 中结合使用。 - **注意事项**: - 性能:复杂表达式可能降低效率,优先使用具体路径(如 `/` 代替 `//`)。 - 兼容性:不同解析器(如 lxml、浏览器内置)对 XPath 支持略有差异。 - 错误调试:使用工具如浏览器开发者工具(按 F12 测试 XPath)。 XPath 是高效的数据导航工具,掌握基础语法后,可快速应用于实际项目[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值