xpath语法

相信写过爬虫的同学,都知道XPath的存在。博主最近在学习Scrapy的时候,就了解了一下XPath语法,这里给大家简单地介绍一下:

首先我们需要了解几个 XPath 术语。
2017/3/3 16:02:29

节点(node)

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

以下面这xml文档为例:

    <?xml version="1.0" encoding="ISO-8859-1"?>

    <class>

    <student>
      <name gender="boy">Harry Potter</name>
      <ID>24</ID>
    </student>

    <student>
      <name gender="girl">Li Rose<font color=red>(monitor)</font></title>
      <ID>1</ID>
    </student>

    </class>

上面例子的节点为:

    <classs> (文档节点/根节点)
    <ID>24</ID> (元素节点)
    gender="boy" (属性节点) 
节点关系

父:每个元素以及属性都有一个父。例子中

基本值(或称原子值,Atomic value)

基本值是无父或无子的节点。
上面例子的基本值为:

    Harry Potter
    "boy"

项目(Item)

项目是基本值或者节点。


ok,接下来开始正式讲解 XPath 语法(注意,以下表达式当然可以混合使用):

1 nodename

选取此节点的所有子节点。

from scrapy import Selector

def parse(self, response):
    selector=Selector(response)
    content=selector.xpath(class)# 选取 class 元素的所有子节点。

2 /

从根节点选取。

from scrapy import Selector

def parse(self, response):
    selector=Selector(response)
    '''
    选取根元素 class。
    注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
    '''
    content1=selector.xpath(/class)
    content2=selector.xpath(/class/student)

3 //

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

from scrapy import Selector

def parse(self, response):
    selector=Selector(response)
    content=selector.xpath(//ID)# 选取所有ID子元素,而不管它们在文档中的位置。

4 .

选取当前节点。

5 ..

选取当前节点的父节点。

6 @

选取属性。

from scrapy import Selector

def parse(self, response):
    selector=Selector(response)  
    # 选取所有gender="boy"属性的节点,而不管它们在文档中的位置。
    content=selector.xpath(//[@gender="boy"])

7 谓语(Predicates)

/class/student[1]  
选取属于 class 子元素的第一个 student 元素。

/class/student[last()]
选取属于 class 子元素的最后一个 student 元素。

/class/student[last()-1]
选取属于 class 子元素的倒数第二个 student 元素。

/class/student[position()<3]
选取属于 class 子元素的前两个 student 元素。

/class/student[@gender]
选取所有拥有名为 gender 的属性的 student 元素。

/class/student[@gender="boy"]
选取所有拥有 gender="boy" 属性的 student 元素。

/class/student[ID<50]
选取 class 元素的所有 student 元素,且其中的 ID 元素的值须小于 50。

/class/student[ID<50]/name
选取 class 元素中的 student 元素的所有 name 元素,且其中的 ID 元素的值须小于 35。

8 通配符

    1. *              匹配任何元素节点
    2. @*            匹配任何属性节点
    3. node()        匹配任何类型的节点

9 拓展

对于如下的xml文档(参照http://www.tuicool.com/articles/iqQFBn

<div id="test2">美女,<font color=red>你的微信是多少?</font><div>

如果使用:
data = selector.xpath('//div[@id="test2"]/text()').extract()[0]
只能提取到“美女,”;

如果使用:
data = selector.xpath('//div[@id="test2"]/font/text()').extract()[0]
又只能提取到“你的微信是多少?”

到底我们要怎样才能把“美女,你的微信是多少”提取出来?

快使用xpath的string(.)!!!

    data = selector.xpath('//div[@id="test2"])
    info = data.xpath('string(.)').extract()[0]

轻松搞定,没有后顾之忧!!

———-

转载请告知!!博主个人博客:http://www.kingboung.me
文章有不完善的地方,请留言告知!My lord

<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、付费专栏及课程。

余额充值