使用lxml的selector.xpath()返回空数组,XPath Helper测试正常求解决
问题排查与解决办法
1. 亚马逊反爬导致页面内容不一致
亚马逊会对非浏览器发起的请求做反爬限制,你用requests获取的页面内容大概率和浏览器渲染的页面不一样,这是最核心的原因。可以试试这两个调整:
- 补充更贴近真实浏览器的请求头,比如添加语言、来源页信息:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9', 'Referer': 'https://www.amazon.com/' } - 加入浏览器的
cookies(从浏览器开发者工具的网络请求里复制),亚马逊会通过cookie识别用户状态,没有有效cookie可能返回简化版页面。
2. 绝对XPath过于脆弱
你用的是全路径的绝对XPath,只要亚马逊微调页面布局(比如增减一个div层级),这个路径就直接失效。换成基于元素属性的相对XPath更稳定,比如通过"Brand"文本定位目标元素:
# 定位标注"Brand"的单元格对应的品牌值 brand = selector.xpath("//th[contains(text(), 'Brand')]/following-sibling::td/span")
3. 浏览器自动生成的tbody标签
多数浏览器会自动给table标签补全tbody,但requests拿到的原始HTML里可能没有这个标签,导致你的XPath因为包含tbody而匹配失败。可以去掉路径里的tbody试试:
brand = selector.xpath('/html/body/div[1]/div[2]/div[6]/div[4]/div[4]/div[36]/div/table/tr[1]/td[2]/span')
验证小技巧
先打印web.text看看返回的页面内容是否和浏览器一致,或者用etree.tostring(selector)输出解析后的HTML,确认目标元素是否真的存在。
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

