1 XPath 的基本语法和功能

1.1 . 选择节点

  • /:绝对路径,从根节点开始。
  • //:相对路径,从当前节点及其子节点开始查找。
  • .:当前节点。
  • ..:当前节点的父节点。
  • @:选择属性。
1.1.1 示例:
1
2
3
4
5
6
7
8
9
10
11
12
<bookstore>
<book category="COOK">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J.K. Rowling</author>
<year>2005</year>
</book>
</bookstore>
  • 选择所有 book 元素

    1
    //book
  • 选择所有 title 元素

    1
    //title
  • 选择 bookstore 下的所有 book 元素

    1
    /bookstore/book

1.2 . 节点测试

  • node():选择任何类型的节点。
  • text():选择文本节点。
  • comment():选择注释节点。
1.2.1 示例:
  • 选择所有文本节点
    1
    //text()

1.3 . 谓语

  • [predicate]:谓语用于过滤节点集合。
1.3.1 示例:
  • 选择 categoryCOOKbook 元素
    1
    //book[@category='COOK']

1.4 .

  • ancestor::*:选择当前节点的所有祖先节点。
  • parent::*:选择当前节点的父节点。
  • child::*:选择当前节点的所有子节点。
  • following::*:选择当前节点之后的所有节点。
  • preceding::*:选择当前节点之前的所有节点。
1.4.1 示例:
  • 选择 title 元素的所有祖先节点
    1
    //title/ancestor::*

1.5 . 函数

  • string-length():计算字符串长度。
  • normalize-space():去除字符串两端的空白字符。
  • starts-with():判断字符串是否以指定前缀开始。
  • contains():判断字符串是否包含指定子串。
  • translate():字符串翻译函数。
1.5.1 示例:
  • 选择标题包含 “Italian” 的书籍

    1
    //book[starts-with(title, 'Italian')]
  • 选择标题包含 “Potter” 的书籍

    1
    //book[contains(title, 'Potter')]

2 XPath 在 Web 爬虫中的应用

在使用 Python 进行 Web 爬虫开发时,通常会结合 lxmlBeautifulSoup 库来解析 HTML,并使用 XPath 表达式来提取数据。

2.1 示例代码

假设我们要从一个网页中提取所有文章标题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from lxml import etree

html = '''
<html>
<body>
<h1>First Article</h1>
<h1>Second Article</h1>
<h1>Third Article</h1>
</body>
</html>
'''

# 解析 HTML 文档
root = etree.fromstring(html)

# 使用 XPath 提取所有 h1 标题
titles = root.xpath('//h1/text()')

print(titles) # 输出:['First Article', 'Second Article', 'Third Article']

3 总结

XPath 是一种强大的工具,用于在 XML 和 HTML 文档中精确地定位和提取数据。掌握 XPath 的基本语法和功能可以帮助你在 Web 开发和爬虫项目中更有效地处理文档结构。通过结合 Python 的第三方库,如 lxmlBeautifulSoup,可以更加便捷地使用 XPath 来解析和提取数据。