Torres-tao  

Xpath表达式

Xpath(XML Path Language):XML路径语言,它是一门在XML文档中查找信息的语言,最初被用来搜寻XML文档,同时它也适用于搜索HTML文档。因此,在爬虫过程中可以使用XPath来提取相应的数据。

XML是一种遵守W3C标准的标记语言,类似于HTML,只是两者的设计目的不同,XML通常被用来传输和存储数据,而HTML常用来显示数据。

Xpath使用路径表达式来选取XML/HTML文档中的节点或节点集。Xpath的功能十分强大,它除了提供了简洁的路径表达式之外,还提供了100多个内建函数,包括处理字符串、数值、日期以及时间的函数。因此,Xptah路径表达式几乎可以匹配所有的元素节点。

Xpath节点

Xpath提供了多种类型的节点,常用的节点有:元素、属性、文本、注释以及文档节点,示例如下:

<?xml version="1.0" encoding="utf-8"?>
<website>
<site>
  <title lang="zh-CN">website name</title>
  <name>编程帮</name>
  <year>2010</year>
  <address>www.biancheng.net</address>
</site>
</website>

说明:

<website></website>(文档节点,也称根节点)
<name></name>(元素节点)
lang="zh-CN"(属性节点)

节点关系

<bookstore>
<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>
</bookstore>

父(Parent)

每个元素以及属性都有一个父。上述示例中,book元素是title、author、year、price元素的父

子(Chirdren)

元素节点可以有零个、一个或多个子。上述示例中,title、author、year、price元素是book元素的子

同胞(Sibling)

拥有相同的父的节点。上述示例中,title、author、year、price元素都是同胞

后代(Descendant)

某个节点的子、子的子等。上述示例中,bookstroe的后辈是book、title、author、year、price元素。

先辈(Ancestor)

某节点的父、父的父等。上述示例中,title元素的先辈是:book、bookstore。

Xpath基本语法

1、基本语法使用

Xpath使用路径表达式在文档中选取节点,下表列出了常用的表达式规则:

表达式 描述
node_name 选取此节点的所有子节点
/ 绝对路径匹配,从根节点选取
// 相对路径匹配,从所有节点中查找当前选择的节点,包括子节点和后代节点,其第一个/表示根节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性值,通过属性值选取数据。常用元素属性有@id、@name、@type、@class、@title、@herf

使用如下xml文档来讲解Xpath表达式的基本应用

<ul class="BookList">
  <li class="book1" id="book_01" href="http://www.biancheng.net/">
        <p class="name">c语言小白变怪兽</p>
        <p class="model">纸质书</p>
        <p class="price">80元</p>
        <p class="color">红蓝色封装</p>
    </li>
  
    <li class="book2" id="book_02" href="http://www.biancheng.net/">
        <p class="name">Python入门到精通</p>
        <p class="model">电子书</p>
        <p class="price">45元</p>
        <p class="color">蓝绿色封装</p>
    </li>
</ul>

路径表达式以及相应的匹配内容如下:

xpath表达式://li/p[@class="name"]
匹配内容:
c语言小白变怪兽
Python入门到精通


xpath表达式://li/p[@class="model"]
匹配内容:
纸质书
电子书

xpath表达式://ul/li/@href
匹配内容:
http://www.biancheng.net/
http://www.biancheng.net/  

注意:当需要查找某个特定的节点或者选取节点中包含的指定值时需要使用[]方括号。如下所示:

xpath表达式://ul/li[@class="book2"]/p[@class="price"]
匹配结果:45元

2、xpath通配符

xpath表达式的通配符可以用来选取未知的节点元素,基本语法如下:

通配符 描述说明
* 匹配任意元素节点
@* 匹配任意属性节点
node() 匹配任意类型的节点

示例如下:

xpath表达式://li/*

匹配内容:
c语言小白变怪兽
纸质书
80元
红蓝色封装
Python入门到精通
电子书
45元
蓝绿色封装

3、多路径匹配

多个Xpath路径表达式可以同时使用,其语法如下:

xpath表达式1 | xpath表达式2 | xpath表达式3

示例:

表达式://ul/li[@class="book2"]/p[@class="price"]|//ul/li/@href

匹配内容:
45元
http://www.biancheng.net/
http://www.biancheng.net/

Xpath内建函数

Xpath提供了100+的内建函数,给我们提供了很多便利,比如实现文本匹配、模糊匹配以及位置匹配等,以下为几个常用的内建函数。

函数名 xpath表达式示例 示例说明
text() ./text() 文本匹配,表示值取当前节点中的文本内容
contains() //div[contains(@id,"stu")] 模糊匹配,表示选择id中包含“stu”的所有div节点
last() //*[@class='web'][last()] 位置匹配,表示选择@class=web的最后一个节点
position() //*[@class='site'][position()<=2] 位置匹配,表示选择@class=site的前两个节点
start-with() "//input[start-with(@id,'st')]" 匹配id以“st”开头的元素
ends-with() "//input[ends-with(@id,'st')]" 匹配id以“st”结尾的元素
concat(string1,string2) concat('Torres',.//*[@class='site']/@href) Torres与标签类别属性为site的herf地址做拼接
posted on 2022-03-24 17:19  雷子锅  阅读(133)  评论(0编辑  收藏  举报