Xpath语法学习
XPath是一门在XML文档中查找信息的语言,被用于在XML文档中通过元素和属性进行导航。XPath虽然是被设计用来搜寻XML文档,不过它也能很好地在HTML文档中工作,并且大部分浏览器也支持通过XPath来查询节点。在Python爬虫开发中,经常使用XPath查找提取网页中的信息,因此XPath非常重要,支持Xpath语法的模板有lxml、scrapy。
文档示例:
<? xml version="1.0" encoding="ISO-8859-1"? >
<classroom>
<student>
<id>1001</id>
<name lang="en">marry</name>
<age>20</age>
<country>China</country>
</student>
<student>
<id>1002</id>
<name lang="en">jack</name>
<age>25</age>
<country>USA</country>
</student>
</classroom>
1、路径表达式
| 表达式 | 用途 |
| nodename | 选取此节点的所有子节点 |
| / | 从根节点选取 |
| // | 选择任意位置的某个节点 |
| . | 选取当前节点 |
| .. | 选取当前节点的父节点 |
| @ | 选取属性 |
2、节点选取示例
| 实现效果 | 路径表达式 |
| 选取classroom元素的所有子节点 | classroom |
| 选取根元素classroom | /classroom |
| 选取属于classroom的子元素的所有student元素 | classroom/student |
| 选取所有student子元素,而不管它们在文档中的位置 | //student |
| 选择属于classroom元素的后代的所有student元素,而不管它们位于classroom之下的什么位置 | classroom//student |
| 选取名为lang的所有属性 | //@lang |
3、谓语示例
| 实现效果 | 路径表达式 |
| 选取属于classroom子元素的第一个student元素 | /classroom/student[1] |
| 选取属于classroom子元素的最后一个student元素 | /classroom/student[last()] |
| 选取属于classroom子元素的倒数第二个student元素 | /classroom/student[last()-1] |
| 选取最前面的两个属于classroom元素的子元素的student元素 | /classroom/student[position()<3] |
| 选取所有拥有名为lang的属性的name元素 | //name[@lang] |
| 选取所有name元素,且这些元素拥有值为en的lang属性 | //name[@lang='en'] |
| 选取classroom元素的所有student元素,且其中的age元素的值须大于20 | /classroom/student[age>20] |
| 选取classroom元素中的student元素的所有name元素,且其中的age元素的值须大于20 | /classroom/student[age>20]/name |
4、通配符* 与 | 操作符
| 实现效果 | 路径表达式 |
| 选取classroom元素的所有子元素 | /classroom/* |
| 选取文档中的所有元素 | //* |
| 选取所有带属性的name元素 | //name[@*] |
| 选取student元素的所有name和age元素 | //student/name | //student/age |
| 选取属于classroom元素的student元素的所有name元素,以及文档中所有的age元素 | /classroom/student/name | //age |
5、Xpath轴
| 轴名称 | 含义 |
| child | 选取当前节点的所有元素 |
| parent | 选取当前节点的父节点 |
| ancestor | 选取当前节点的所有先辈(父、祖父等) |
| ansestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 |
| descendant | 选取当前节点的所有后代元素(子、孙等) |
| descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身 |
| preceding | 选取文档中当前节点的开始标记之前的所有节点 |
| following | 选取文档中当前节点的结束标记之后的所有节点 |
| preceding-sibling | 选取当前节点之前的所有同级节点 |
| following-sibling | 选取当前节点之后的所有同级节点 |
| self | 选取当前节点 |
| attribute | 选取当前节点的所有属性 |
| namespace | 选取当前节点的所有命令空间节点 |
文档示例:
<? xml version="1.0" encoding="ISO-8859-1"? >
<classroom>
<student>
<id>1001</id>
<name lang="en">marry</name>
<age>20</age>
<country>China</country>
</student>
<student>
<id>1002</id>
<name lang="en">jack</name>
<age>25</age>
<country>USA</country>
</student>
<teacher>
<classid>1</classid>
<name lang="en">tom</name>
<age>50</age>
<country>USA</country>
</teacher>
</classroom>
6、Xpath轴示例分析
| 实现效果 | 路径表达式 |
| 选取当前classroom节点中子元素的teacher节点 | /classroom/child::teacher |
| 选取所有id节点的父节点 | //id/parent::* |
| 选取所有以classid为子节点的祖先节点 | //classid/ancestor::* |
| 选取classroom节点下所有后代节点 | /classroom/descendant::* |
| 选取所有以student为父节点的id元素 | //student/descendant::id |
| 选取所有classid元素的祖先节点及本身 | //classid/ancestor-or-self::* |
| 选择/classroom/student本身及所有后代元素 | /classroom/student/descendant-or-self::* |
| 选取/classroom/teacher之前的所有同级节点,结果就是选择了所有student节点 | /classroom/teacher/preceding-sibling::* |
| 选取/classroom中第二个student之后的同级节点,结果就是选择了teacher节点 | /classroom/student[2]/following-sibling::* |
| 选取/classroom/teacher/节点所有之前的节点(除其祖先外),不仅仅是student节点,还有里面的子节点 | /classroom/teacher/preceding::* |
| 选取classroom中第二个student之后的所有节点,结果就是选择了teacher节点及其子节点 | /classroom/student[2]/following::* |
| 选取student节点,单独使用没有什么意思。主要是跟其它轴一起用,如ancestor-of-self,descendant-or-self | //student/self::* |
| 选取/classroom/teacher/name节点下的所有属性 | /classroom/teacher/name/attribute::* |
7、运算符
| 运算符 | 描述 | 实例 | 含义 |
| | | 计算两个节点集 | //student/name | //student/age | 选取student元素的所有name和age元素 |
| + | 加法 | /classroom/student[age=19+1] | 选取classroom元素的所有student元素,且其中的age元素的值须等于20 |
| - | 减法 | /classroom/student[age=21-1] | 同上 |
| * | 乘法 | /classroom/student[age=4*5] | 同上 |
| div | 除法 | /classroom/student[age=40 div 2] | 同上 |
| = | 等于 | /classroom/student[age=20] | 同上 |
| != | 不等于 | /classroom/student[age!=20] | 选取student元素的所有name和age元素,且其中的age元素的值不等于20 |
| < | 小于 | /classroom/student[age<20] | 选取student元素的所有name和age元素,且其中的age元素的值小于20 |
| <= | 小于等于 | /classroom/student[age<=20] | 选取student元素的所有name和age元素,且其中的age元素的值小于等于20 |
| > | 大于 | /classroom/student[age>20] | 选取student元素的所有name和age元素,且其中的age元素的值大于20 |
| >= | 大于等于 | /classroom/student[age>=20] | 选取student元素的所有name和age元素,且其中的age元素的值大于等于20 |
| or | 或 | /classroom/student[age<20 or age>25] | 选取student元素的所有name和age元素,且其中的age元素的值须小于20,或者大于25 |
| and | 与 | /classroom/student[age>20 and age<25] | 选取student元素的所有name和age元素,且其中的age元素的值须大于20,或者小于25 |
| mod | 计算除法的余数 | 5 mod 2 | 1 |
浙公网安备 33010602011771号