数据提取(一):Xpath - 语法
程序员文章站
2022-07-14 17:00:43
...
一、Xpath简述
xpath(XML Path Language)是一门在XML、HTML文档中查找信息的语言,可用来在XML HTML文档中对元素和属性进行遍历
二、Xpath Helper简述
xPath helper 是xpath的开发工具,是一款 Chrome 浏览器的开发者插件/Firefox插件为Try Xpath,安装了 xPath helper 后能轻松获取 HTML元素的 xPath,程序员不再需要通过搜索 html 源代码,定位一些 id 去找到对应的位置去解析网页了
三、Xpath节点
Xpath有七种类型的节点:
元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点
XML 文档是被作为节点树来对待的,树的根被称为文档节点或者根节点
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
(1)上面的XML文档中的节点例子:
<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点)
(2)基本值的例子:J K. Rowling"en"
基本值(或称原子值,Atomic value):基本值是无父或无子的节点。
(3)项目(Item):项目是基本值或者节点。
(4)节点的关系:
父:每个元素以及属性都有一个父。
子:元素节点可有零个、一个或多个子
同胞:拥有相同的父的节点
先辈:某节点的父、父的父,等等。
后代:某个节点的子,子的子,等等。
四、Xpath语法
XPath 使用路径表达式来选取 XML 文档中的节点或节点集
节点通过沿着路径 (path) 或者步 (steps) 来选取
(1)选取结点
路径表达式 | 描述 | 示例 | 结果 |
---|---|---|---|
nodename | 选取此节点的所有子节点 | bookstore | 选取bookstore下所有的子节点 |
/ | 如果是在最前面 代表从根节点开始选取 否则选择某结点下的某个节点 | (1)/bookstore(2)bookstore/book | (1)选取根结点下所有的bookstore结点(2)选取bookstore节点下所有的book结点 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
// | 从全局结点中中选择节点,随便在哪个位置 | (1)//book (2)bookstore//book | (1)从全局节点中找到所有的book结点,不管他们在哪个位置(2)选择 bookstore结点后代中的所有 book结点,不管它们位于 bookstore 之下的什么位置 |
@ | 选取某个节点的属性 | (1)//book[@price](2)//@lang | (1)选取所有拥有price属性的book结点(2)选取名为 lang 的所有属性 |
. | 选取当前节点 | ||
.. | 选取当前节点的父节点 |
(1)查找book
方法一:html/body/bookstore/book
注意head和body同级的,不是html/head/body/bookstore/book
方法二://book
结果得到两个book
注意/获取子节点 //获取子孙节点
(2)查找lang属性
//book/title[@lang="eng"] 选取所有的title结点 且这些节点拥有属性值为eng的lang属性
结果得到 Harry Potter
//book/title[@lang] 选取所有的title结点 且这些节点拥有lang属性
注意有时候属性包含了多个值使用contains()函数,如
//title[contains(@lang,'eng')]
(3)上面例子中有两个book,如果只查找其中某一个book 就要用到谓语
特别注意:第一个下标是从 1 开始 不是从 0 开始
所谓谓语,是用来查找某个特定的节点或者包含某个指定的值的节点,谓语被嵌在方括号中
/bookstore/book[price>35.00]
选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title
选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
(2)谓语/谓词
(3)通配符 *
通配符 | 描述 | 示例 | 结果 |
---|---|---|---|
* | 匹配任意节点 | /bookstore/* | 选取bookstore下的所有子元素 |
@* | 匹配节点的任意属性 | //book[@*] | 选取所有带有属性的book元素 |
(4)运算符
特别注意逻辑或是or
| 是计算两个节点集 主要用来选取若干路径 如
//bookstore/book | //book/title
选取所有book元素以及book元素下所有的title元素