平时想批量抓个天气预报、商品价格或者新闻标题,手动复制太费劲?其实用几行网络脚本配合XPath,分分钟搞定。关键不是装多牛的工具,而是找准节点、写对表达式。
先搞懂XPath长啥样
比如网页里有这样一段HTML:
<div class="item"><h3 class="title">iPhone 15 Pro</h3><span class="price">¥7999</span></div>想取价格,XPath可以写成 //span[@class='price']/text();想取标题,就用 //h3[@class='title']/text()。注意:双引号得用单引号包着,不然脚本容易报错。Python里跑起来最顺手
装个 lxml 和 requests 就够:
import requests
from lxml import html
url = 'https://example.com'
res = requests.get(url)
tree = html.fromstring(res.content)
prices = tree.xpath('//span[@class="price"]/text()')
print(prices)如果页面用了JavaScript动态加载,requests拿不到完整内容,那就换 playwright 或 selenium 先渲染再提取。绕开常见坑
有些网站class名带随机字符串,比如 class="price_abc123",这时候别死磕class,试试父级定位://div[contains(@class, "item")]/span/text();或者用文本特征匹配://span[contains(text(), "¥")]/text()。还有时候XPath明明对了却返回空——八成是网页有iframe,得先进iframe文档再查。
浏览器里直接试,不写代码也行
打开Chrome开发者工具(F12),在Console里粘贴:
$x('//h2[@class="post-title"]/a/text()')回车就能看到匹配到的所有标题文字。边调边改,比写完再跑快多了。实际用的时候,别一上来就写复杂表达式。先用浏览器复制一个简单XPath,再一点点加条件,比如从 //a 到 //div[@id="list"]//a[@href],稳一点,少踩坑。