Python通过XPath定位含data-gs属性的span提取文本失败求助
问题分析与解决方案
核心问题原因
data-gs属性是动态生成的:该属性值会随每次页面加载变化,用固定值写XPath必然匹配不到元素。- 等待时间不足:
sleep(1)无法保证页面完全加载出目标元素,尤其是Google航班这类动态渲染的页面。 - 解析方式冗余:将
driver.page_source转成lxml树解析,不如直接用Selenium的DOM定位API适配动态页面。
修复后的代码
#!/usr/bin/env python3 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 def main(): driver = webdriver.Chrome() URL = "https://www.google.com/travel/flights/search?tfs=CBwQAhooEgoyMDI0LTA2LTEwagwIAhIIL20vMDFfZDRyDAgDEggvbS8wMTkxNBooEgoyMDI0LTA4LTEzagwIAxIIL20vMDE5MTRyDAgCEggvbS8wMV9kNEABSAFwAYIBCwj___________8BmAEB&tfu=EgYIAhAAGAA&hl=en-US&curr=USD" driver.get(URL) # 显式等待元素加载,最多等待10秒 wait = WebDriverWait(driver, 10) price_elements = wait.until(EC.presence_of_all_elements_located( (By.XPATH, "//span[@role='text' and contains(@aria-label, 'US dollars')]") )) print(f"找到{len(price_elements)}个价格元素") for elem in price_elements: # 清理文本中的换行和多余空格 print(elem.text.strip()) driver.close() return main()
修改说明
- 改用稳定定位规则:放弃动态的
data-gs,使用role='text'+包含US dollars的aria-label组合,这类属性是页面逻辑固定的,不会随加载变化。 - 显式等待替代固定休眠:
WebDriverWait会主动等待目标元素出现后再执行后续代码,避免页面加载慢导致的元素未找到问题。 - 直接使用Selenium API:无需转成lxml树,Selenium直接操作DOM,更适配Google航班这类动态渲染的页面。
内容的提问来源于stack exchange,提问作者beetlej
相关产品推荐
相关产品推荐

