You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:20:55