Python中XPath提取booking.com评论返回空列表,如何解决?
Booking.com酒店评论爬取返回空结果的排查方案
第一步:排查请求逻辑错误
- 你代码中直接调用
URL.content属于语法错误:你定义的URL是字符串类型,不存在content属性。需要先使用网络请求库获取页面响应,同时必须添加请求头模拟浏览器,避开Booking的基础反爬策略,示例正确请求代码如下:
import requests import lxml.html URL = "https://www.booking.com/hotel/ph/oyo-518-mytown-amsterdam-manila.en-gb.html?label=gen173nr-1DCAEoggI46AdIM1gEaLQBiAEBmAEJuAEHyAEN2AED6AEBiAIBqAIDuALwtZuKBsACAdICJDZiZTlhNTRlLTc5MzktNGIwNC05NmZjLWI4Nzg3NGZhNWQ1MtgCBOACAQ;all_sr_blocks=601616502_275784337_2_0_0;checkin=2021-10-01;checkout=2021-10-02;dest_id=-2437894;dest_type=city;dist=0;group_adults=2;group_children=0;hapos=1;highlighted_blocks=601616502_275784337_2_0_0;hpos=1;no_rooms=1;room1=A%2CA;sb_price_type=total;sr_order=popularity;sr_pri_blocks=601616502_275784337_2_0_0__139646;srepoch=1632033539;srpvid=af482ec1c5c20263;type=total;ucfs=1&#tab-reviews" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Accept-Language": "en-GB,en;q=0.9" } resp = requests.get(URL, headers=headers) # 先确认响应状态码为200,若为403/404说明请求被拦截或链接已失效 print(resp.status_code) tree = lxml.html.fromstring(resp.text)
- 额外注意你使用的URL中包含2021年的时效参数(checkin日期、srepoch时间戳等),大概率已经失效,建议从浏览器重新复制当前有效的酒店评论页链接再测试。
第二步:排查页面内容是否匹配
- Booking的评论属于懒加载动态内容,默认请求初始页面不会返回完整评论列表。你可以将获取到的页面源码写入本地HTML文件打开查看,确认源码中是否存在
review_list_page_container元素:
with open("test.html", "w", encoding="utf-8") as f: f.write(resp.text)
- 如果本地打开的HTML文件中没有评论内容,说明评论是异步加载的,无法直接通过静态HTML解析获取。
第三步:排查XPath有效性
- 浏览器复制的全路径XPath稳定性极低,浏览器中展示的DOM是JS执行后的最终结构,和你请求拿到的原始HTML结构可能存在差异,全路径只要有一个节点结构变动就会匹配失败。建议简化XPath使用模糊匹配规则,先测试能否命中评论容器:
# 先匹配所有评论项 reviews = tree.xpath('//div[contains(@class, "review-card")]') print(len(reviews)) # 确认能匹配到评论后,再逐层提取对应字段
最终解决方案
- 若静态页面已包含评论内容:优化XPath使用类名、属性等模糊匹配规则,替换浏览器复制的全路径XPath即可。
- 若评论为动态加载:
- 方案一:使用Selenium、Playwright等浏览器自动化工具,模拟页面滚动加载完整评论后再解析DOM。
- 方案二:打开浏览器开发者工具的网络面板,筛选XHR/ Fetch请求,找到评论数据的异步接口,直接请求接口获取结构化的JSON格式评论数据,效率远高于解析HTML。
内容的提问来源于stack exchange,提问作者Rodger
相关产品推荐
相关产品推荐

