为什么我的BeautifulSoup代码无法获取Eurostar页面中train-table类UL元素内容?
问题原因
- 核心原因是你请求的欧洲之星车票查询页面属于客户端动态渲染页面,你直接通过
requests.get()只能获取到服务器返回的初始静态HTML源码,而你要找的train-table类ul列表,是页面加载完成后,由浏览器执行JavaScript脚本调用后台接口获取车次数据后,才动态插入到DOM结构中的,初始静态HTML里不存在该元素,因此BeautifulSoup解析后搜索结果为空。 - 次要排查点:部分站点会拦截无浏览器标识的爬虫请求,你可以先打印
page.status_code确认返回状态码,或者打印page.text查看返回内容是否为正常页面,也可以添加浏览器User-Agent请求头重试,避免被反爬策略拦截返回错误页面:
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" } page = requests.get(URL, headers=headers)
可用解决方案
方案1:使用无头浏览器模拟真实访问
采用Selenium、Playwright等工具模拟真实浏览器加载页面,等待动态内容渲染完成后再提取元素,示例代码如下(以Selenium为例):
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 无头模式启动Chrome options = webdriver.ChromeOptions() options.add_argument("--headless=new") driver = webdriver.Chrome(options=options) # 传入生成的查询URL url = input_parser.createURL() driver.get(url) # 等待train-table类的ul元素加载完成,最长等待10秒 try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "train-table")) ) # 提取列表内的内容做后续处理 results = element.find_elements(By.TAG_NAME, "li") finally: driver.quit()
方案2:直接调用官方查询接口
打开浏览器开发者工具的「网络」面板,筛选XHR/Fetch请求,找到页面加载时请求车次数据的接口,直接构造参数请求该接口获取JSON格式的车次价格数据,这种方式效率更高、数据解析更简单,开发成本远低于解析HTML页面。
补充说明
你代码中直接给input_parser.adults赋值的写法没有问题,不影响URL生成,不是导致返回空的原因。
内容的提问来源于stack exchange,提问作者ignasiialemany
相关产品推荐
相关产品推荐

