使用Selenium提取印度新冠网站数据时Xpath无法定位元素的问题求助
解决Selenium提取Covid19India网站数据时的元素定位问题
我看了你遇到的问题——想从Covid19India网站顶部栏提取确诊、现存、康复、死亡的每日和累计数据,但一直碰到元素找不到的错误,哪怕加了sleep也没用。咱们来一步步解决这个问题:
错误根源分析
你代码里的核心问题出在XPath的使用方式上:
- 你已经通过
find_elements_by_class_name('Level')拿到了每个统计项的容器元素,但后续用的XPath是绝对路径(从#root开始),这完全忽略了当前item的上下文,相当于每次都从整个页面重新找元素,自然会定位失败。 - 另外,
sleep(5)是固定等待,不如显式等待可靠——有时候页面加载慢,5秒不够;有时候加载快,白等时间。
修正后的代码
这里给你调整后的代码,解决了定位问题,还优化了等待逻辑:
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 PATH = 'ChromeDriver/chromedriver' driver = webdriver.Chrome(PATH) driver.get('https://www.covid19india.org/') try: # 显式等待Level元素加载完成,最多等10秒 stats_containers = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CLASS_NAME, 'Level')) ) # 四个统计项的顺序是:确诊、现存、康复、死亡 stats_labels = ["确诊", "现存", "康复", "死亡"] for idx, container in enumerate(stats_containers): # 用相对XPath定位当前容器内的h4(每日数据)和h1(累计数据) daily_data = container.find_element(By.XPATH, './/h4').text cumulative_data = container.find_element(By.XPATH, './/h1').text print(f"{stats_labels[idx]}: 新增 {daily_data} | 累计 {cumulative_data}") finally: driver.quit()
关键改进点说明
- 用显式等待替代固定sleep:
WebDriverWait会等到目标元素出现再继续执行,比硬等时间更灵活可靠,避免因加载速度波动导致的错误。 - 使用相对XPath:开头的
.表示从当前元素(也就是每个container)开始查找,这样就能精准定位到每个统计项内部的h4和h1,而不会跑到页面其他地方去找。 - 添加统计项标签:利用
enumerate和预设的标签列表,让输出结果更清晰,一眼就能区分每个数据对应的类别。
额外提示
如果后续网站结构有变化(比如class名或元素顺序调整),你可以通过浏览器的开发者工具(F12)重新检查元素结构,调整定位方式。比如如果h4有特定的class(比如DailyCount),也可以用By.CLASS_NAME来定位,比XPath更直观:
daily_data = container.find_element(By.CLASS_NAME, 'DailyCount').text cumulative_data = container.find_element(By.CLASS_NAME, 'TotalCount').text
内容的提问来源于stack exchange,提问作者Rishi
相关产品推荐
相关产品推荐

