
本文讲解如何在动态网页(如 Google Travel)中绕过不稳定的 data-gs 属性,改用基于稳定 CSS 类名的 XPath 表达式,结合 Selenium 与 lxml 成功提取航班价格文本值。
本文讲解如何在动态网页(如 google travel)中绕过不稳定的 `data-gs` 属性,改用基于稳定 css 类名的 xpath 表达式,结合 selenium 与 lxml 成功提取航班价格文本值。
在爬取 Google 机票搜索页(google.com/travel/flights)等现代 SPA 应用时,直接依赖 data-gs、data-id 或其他自动生成的属性进行 XPath 定位往往失败——因为这些属性值每次请求均动态生成,不具备可复现性。上述代码中 len(flights) 输出为 0,正是由于硬编码了已过期的 data-gs 值,导致 XPath 无法匹配任何节点。
更可靠的方式是基于语义化结构和稳定类名(class)定位。通过浏览器开发者工具(F12)审查页面 DOM 可发现:价格 总是嵌套在具有固定视觉含义的容器中,例如:
- 外层价格卡片通常带有类似 U3gSDe 的 class(表示“价格区块”);
- 中间布局容器含 YMlIz FpEdX(常见于价格行内布局);
- 最终价格文本由 直接承载,且无冗余子节点。
因此,推荐 XPath 表达式为:
//div[contains(@class,'U3gSDe')]/div/div[contains(@class,'YMlIz FpEdX')]/span
该表达式具备以下优势:
- ✅ 不依赖动态属性,抗页面更新能力强;
- ✅ 利用 contains(@class, ...) 兼容多 class 并存场景(如 class="YMlIz FpEdX jYVZQ");
- ✅ 路径层级清晰,兼顾准确性与健壮性。
以下是完整可运行示例(已优化关键细节):
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from lxml import html
from time import sleep
def main():
# 推荐启用无头模式及合理等待策略
options = Options()
options.add_argument("--headless") # 可选:后台运行
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
URL = "https://www.google.com/travel/flights/search?tfs=CBwQAhooEgoyMDI0LTA2LTEwagwIAhIIL20vMDFfZDRyDAgDEggvbS8wMTkxNBooEgoyMDI0LTA4LTEzagwIAxIIL20vMDE5MTRyDAgCEggvbS8wMV9kNEABSAFwAYIBCwj___________8BmAEB&tfu=EgYIAhAAGAA&hl=en-US&curr=USD"
try:
driver.get(URL)
# 关键:等待页面充分渲染(建议用 WebDriverWait 替代 sleep,此处为简化演示)
sleep(5)
tree = html.fromstring(driver.page_source)
# 使用基于 class 的稳定 XPath
price_spans = tree.xpath("//div[contains(@class,'U3gSDe')]/div/div[contains(@class,'YMlIz FpEdX')]/span")
print(f"共找到 {len(price_spans)} 个价格元素:")
for i, span in enumerate(price_spans, 1):
text = span.text.strip() if span.text else "[空文本]"
print(f"{i}. {text}")
finally:
driver.quit() # 推荐用 quit() 确保进程释放
if __name__ == "__main__":
main()? 注意事项与进阶建议:
- ⚠️ sleep(5) 仅为快速验证,生产环境应改用 WebDriverWait 显式等待目标元素出现(如 presence_of_element_located),避免因网络波动导致误判;
- ? 若页面结构更新导致类名变更,可通过 Chrome DevTools 的 “Search all files”(Ctrl+Shift+F)全局检索 U3gSDe 或 YMlIz,快速定位最新 class;
- ? 如需提取对应航班信息(如出发时间、航司),建议用相对 XPath(如 ./preceding-sibling::div[1])或统一父容器下多路径联合提取;
- ? Google Travel 可能对自动化访问做反爬限制,高频请求建议添加随机延时、User-Agent 轮换及代理支持。
掌握“以不变应万变”的定位思想——即优先利用功能语义(如价格区、标题栏、按钮)而非技术痕迹(如动态 ID)——是构建高鲁棒性网页解析逻辑的核心原则。


















