一、XPath 是什么?为什么爬虫必备?
XPath 是一种在 XML/HTML 文档中定位元素的语言,爬虫用它来 “精准抓取” 网页数据。
核心优势:
- 比正则表达式更简洁、高效
- 支持层级定位(父 / 子 / 兄弟节点)
- 可根据属性、文本内容筛选元素
类比:如果把网页比作图书馆,XPath 就是 “找书指南”,能快速定位到你想要的 “数据书籍”。
二、XPath 基础语法(5 分钟速通)
1. 绝对路径与相对路径
- 绝对路径:从根节点开始,用
/
分隔(如:/html/body/div
) - 相对路径:从当前节点开始,用
//
表示任意层级(如://div
)
2. 常用选择器
语法 | 作用 | 示例 |
---|---|---|
//tag | 选取所有 tag 元素 | //div 选所有 div |
//tag[@attr] | 选取带 attr 属性的元素 | //a[@href] 选链接 |
//tag[@attr='value'] | 精确匹配属性值 | //input[@type='text'] |
//tag[text()='内容'] | 按文本内容筛选 | //h3[text()='热门推荐'] |
//tag[index] | 按索引选元素(从 1 开始) | //li[3] 选第 3 个 li |
3. 进阶技巧
- 层级定位:
//div[@class='book']/h2
(选 class 为 book 的 div 下的 h2) - 逻辑组合:
//div[@id='list'] or @class='item']
(选 id 为 list 或 class 为 item 的 div) - 模糊匹配:
contains(@attr, '部分值')
(如://a[contains(@href, 'product')]
)
三、XPath 实战:用爬虫验证学习成果
案例 1:爬取豆瓣电影 Top250(完整代码)
import requests
from lxml import etree
url = 'https://movie.douban.com/top250'
headers = {'User-Agent': 'Mozilla/5.0'} # 模拟浏览器
# 发送请求并解析HTML
response = requests.get(url, headers=headers)
html = etree.HTML(response.text)
# 使用XPath提取数据
movies = html.xpath('//div[@class="item"]')
for
movie in movies: title = movie.xpath('.//span[@class="title"]/text()')[0] # 电影名
rating = movie.xpath('.//span[@class="rating_num"]/text()')[0] # 评分
quote = movie.xpath('.//span[@class="inq"]/text()') # 短评
quote = quote[0] if quote else "无短评"
print(f"{title} - 评分: {rating} - 短评: {quote}")
XPath 解析详解
- 定位电影块:
//div[@class="item"]
- 从任意位置开始,选 class 为
item
的 div(每个电影条目)。
- 从任意位置开始,选 class 为
- 相对路径提取数据:
.//span[@class="title"]
中的.
表示从当前电影块开始查找。
- 处理可能缺失的数据:
quote = quote[0] if quote else "无短评"
避免因缺失短评导致程序崩溃。
四、XPath 调试技巧(必学!)
- 浏览器开发者工具:
- Chrome/Firefox 中右键元素 →
Copy
→Copy XPath
获取自动生成的路径。 - 注意:自动生成的路径可能过于具体(如包含索引),需手动简化。
- Chrome/Firefox 中右键元素 →
- 在线 XPath 测试工具:
- 推荐 XPath Tester,粘贴 HTML 代码后实时测试表达式。
- 常见错误排查:
- 无法定位元素:检查路径是否正确、是否有 iframe 嵌套。
- 结果为空:可能因网页使用 JavaScript 动态加载数据(需用 Selenium 等工具) 总结XPath 是爬虫的 “瑞士军刀”,掌握它能让数据提取事半功倍。本文通过豆瓣电影案例,带你从语法入门到实战应用,后续可以尝试改造代码爬取其他网站(如京东商品、天气数据等)。动手实践才是掌握的关键,快打开开发者工具试试吧!