目录
介绍
对于XPath的概念,百度百科上是这么解释的:XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点 ... ... 提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSLT间的语法模型。但是 XPath 很快的被开发者采用来当作小型查询语言。
节点
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
节点关系 描述并举栗
关系 | 描述 |
父 | 每个元素以及属性都有一个父 |
子 | 元素节点可有零个、一个或多个子 |
同辈 | 拥有相同的父的节点都属于同辈 |
先辈 | 某节点的父、父的父、父的父的父,等等 |
后代 | 某个节点的子、子的子、子的子的子,等等 |
现有如下的XML示例:
<?xml version="1.0" encoding="utf-8"?>
<shop>
<food category="meat can">
<name>canned pork</name>
<year>2018</year>
<price>10</price>
</food >
<food category="garden stuff">
<name>canned canned yellow peach</name>
<year>2018</year>
<price>5</price>
</food >
</shop>
在这个例子中我们可以看到:
父:shop为food category、name、year、price的父,而food category为name、year、price的父 |
子:name、year、price都是food category的子,food category、name、year、price又都是shop的子 |
同辈:name、year、price |
先辈:shop、food category是name、year、price的先辈 |
后代:shop的后代是food category、name、year、price |
路径表达式 描述并举栗
XPath中,使用的是路径表达式来选取XML中的节点或者节点集,一些常用的路径表达式有:
路径表达式 | 路径的描述 |
nodename | 选取这个节点的所有子节点 |
/ | 从根节点选取 |
// | 选择任意位置的某个节点 |
. | 选择当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
* | 匹配未知的元素 |
| | 选取多条路径 |
那么对于示例:
<?xml version="1.0" encoding="utf-8"?>
<shop>
<food category="meat can">
<name>canned pork</name>
<year>2018</year>
<price>10</price>
</food >
<food category="garden stuff">
<name lang='en'>canned canned yellow peach</name>
<year>2018</year>
<price>5</price>
</food >
</shop>
则有:
路径 | 描述 |
shop | 选取shop元素的所有子节点 |
/shop | 选取根元素shop |
shop/food category | 选取属于shop的子元素的所有的food category元素 |
//food category | 选取所有的food category,且不需要在意它们在XML中的位置 |
shop//food category | 选取属于shop的子元素的所有的food category元素,而不需要在意它们在shop之下的什么位置 |
//@lang | 选取名为lang的所有属性 |
/shop/* | 选取shop下的所有的子元素 |
//* | 选取所有元素 |
//food category/name | //food category/year | 选取food category下的name元素和year元素 |
选取特定节点 描述并举栗
一般选取特定节点,需要额外的对路径表达式去进行一些描述,这些描述通常被镶嵌在[ ]中,而写在[ ]中的这个部分,我们称之为谓语,那么对于示例:
<?xml version="1.0" encoding="utf-8"?>
<shop>
<food category="meat can">
<name>canned pork</name>
<year>2018</year>
<price>10</price>
</food >
<food category="garden stuff">
<name>canned canned yellow peach</name>
<year>2018</year>
<price>5</price>
</food >
<food category="fast food">
<name lang='en'>instant noodles</name>
<year>2018</year>
<price>8</price>
</food >
</shop>
则有:
路径 | 描述 |
/shop/food category[1] | 选取属于shop子元素的第一个food category元素 |
/shop/food category[last()] | 选取属于shop子元素的最后一个food category元素 |
/shop/food category[last()-1] | 选取属于shop子元素的倒数第二个food category元素 |
/shop/food category[position()<3] | 选取最前面的两个属于shop的子元素的food category元素 |
//name[@lang] | 选取所有拥有lang属性的name元素 |
//name[@lang=‘en’] | 选取所有拥有lang属性且属性值为en的name元素 |
/shop/food category[price>4] | 选取所有shop下的food category元素,且其中的price值要大于4 |
/shop/food category[price>4]/name | 选取所有shop下的food category元素下的name元素,且其中的price值要大于4 |
//name[@*] | 选取所有带有属性的name元素 |
以上资料大部分出自《Python爬虫开发于项目实战》一书