概述
- XPath是一门在XML文档中查找信息的语言, 对HTML文档也有很好的支持。
- XPath使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
节点概念
父节点
- 每个元素及属性都有一个父节点;
- 在下面的例子中,
user
元素是 name
、 sex
、 id
及 goal
元素的父节点:
1 2 3 4 5 6
| <user> <name>xiao ming/name> <sex>J K. Rowling</sex> <id>34</id> <goal>89</goal> </user>
|
子节点
- 元素节点可有0个、一个或多个子节点,在下面的例子中;
name
、 sex
、 id
及 goal
元素都是 user
元素的子节点:
1 2 3 4 5 6
| <user> <name>xiao ming/name> <sex>J K. Rowling</sex> <id>34</id> <goal>89</goal> </user>
|
同胞节点
- 同胞节点拥有相同的父节点;
- 在下面的例子中,
name
、 sex
、 id
及 goal
元素都是同胞节点:
1 2 3 4 5 6
| <user> <name>xiao ming/name> <sex>J K. Rowling</sex> <id>34</id> <goal>89</goal> </user>
|
先辈节点
- 先辈节点指某节点的父、父的父节点等;
- 在下面的例子中,
name
元素的先辈是 user
元素和 user_database
元素:
1 2 3 4 5 6 7 8
| <user_database> <user> <name>xiao ming/name> <sex>J K. Rowling</sex> <id>34</id> <goal>89</goal> </user> </user_database>
|
后代节点
后代节点指某个节点的子节点, 子节点的子节点等;
在下面的例子中, user_database
的后代是 user
、 name
、 sex
、 id
及 goal
元素:
1 2 3 4 5 6 7 8
| <user_database> <user> <name>xiao ming/name> <sex>J K. Rowling</sex> <id>34</id> <goal>89</goal> </user> </user_database>
|
节点选择
语法表达式
表达式 | 描述 |
---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点, 而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
节点选择实例
路径表达式 | 结果 |
---|
user_database | 选取元素user_database的所有子节点 |
/user_database | 选取根元素user_database注释: 假如路径起始于正斜杠(/), 则此路始终代表到某元素的绝对路径 |
/user_database/user | 选取属于user_database的子元素的所有user元素 |
//user | 选取所有user子元素, 而不管它们在文档中的位置 |
user_database//user | 选择属于user_database元素的后代的所有user元素, 而不管它们位于user_database之下的什么位置 |
@attribute | 选取名为attribute的所有属性 |
其它谓语
Xpath语法中的谓语用来查找某个特定的节点或者包含某个指定值的节点, 谓语在方括号中。
路径表达式 | 结果 |
---|
/user_database/user[1] | 选取属于user_database子元素的第一个user元素 |
//li[@attribute] | 选取所有拥有名为attribute属性的li元素 |
//li[@attribute=‘red’] | 选取所有li元素,且这些元素拥有值为red的attribute属性 |
//li/span/text() | 通过/text()可以获取标签中的文本信息 |
实例代码
1 2 3 4 5 6 7 8 9 10
| import requests from lxml import etree
headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'} url = 'http://www.qiushibaike.c/text/' res = requests.get(url, headers=headers) selector = etree.HTML(res.text) id = selector.xpath('//[@id="qiushi_tag_118732380"]/div[1]/a[2]/h2/text()') print(id)
|