LXML etree.fromstring解析Booking.com页面返回None问题求助
排查Booking.com爬虫部分酒店解析失败的问题
以下是针对你遇到的问题的具体排查步骤和修复建议:
1. 替换HTML解析方法
你当前使用的etree.fromstring()更适合处理规范的XML/HTML片段,而网页HTML通常存在未闭合标签、语法不规范的情况,容易导致解析失败返回None。直接改用etree.HTML(),它专门针对网页HTML做了兼容处理:
# 替换原解析代码 parsed_response = etree.HTML(response.text)
2. 验证请求有效性
先确认请求是否成功获取到正常页面:
- 打印
response.status_code,如果返回403/404/500,说明请求被拦截或页面不存在:print(response.status_code) - 打印
response.text[:500]查看返回内容开头,若出现验证码、反爬提示文本,说明触发了反爬机制。
3. 清理URL中的过期参数
你当前URL包含大量固定会话参数(如sid、srepoch、srpvid),这些参数是临时生成的,过期后会导致请求异常。简化URL,只保留必要参数:
url = ( f"https://www.booking.com/hotel/es/{hotel_id}.en-gb.html" f"?checkin={checkin_date}&checkout={checkout_date}" "&group_adults=2&group_children=0&selected_currency=EUR" )
4. 处理反爬机制
部分酒店可能触发了更严格的反爬,可尝试:
- 使用
requests.Session()保持会话,模拟浏览器的连续请求:session = requests.Session() session.headers.update(headers) response = session.get(url) - 随机更换
User-Agent,避免固定标识被识别; - 添加常见请求头字段,比如
Accept-Language、Referer:headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", "Accept-Language": "en-US,en;q=0.9", "Referer": "https://www.booking.com/" }
5. 检查目标节点结构差异
如果解析价格节点返回None,对比有效/无效酒店的HTML源码:
- 有些酒店可能无可用价格(满房、未开放预订),页面根本没有价格节点;
- 部分酒店的价格节点XPath/CSS选择器与常规不同,需要调整解析路径。
内容的提问来源于stack exchange,提问作者Santiago Veintimilla
相关产品推荐
相关产品推荐

