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

如何在Python Selenium中使用显式等待解析世行项目文档页面

使用Selenium显式等待解析世界银行项目文档页面

需求

  • 访问指定的世界银行项目文档URL
  • 显式等待页面加载完成,需处理两种情况:加载出文档表格,或加载出“No data available.”提示
  • 解析并提取文档表格内容

原始代码问题

你提供的代码存在以下问题:

  • urls列表末尾缺少闭合括号,存在语法错误
  • wait.until的参数使用错误,visibility_of_any_elements_located仅接受一个定位元组,无法直接传入两个定位器
  • 元素定位依赖动态生成的_ngcontent-c2属性,这类属性会随页面渲染变化,稳定性极差
  • 未区分“有表格数据”和“无数据”两种场景,直接提取元素会触发报错

修正后的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd

# 修复urls列表的语法错误
urls = [
    'https://projects.worldbank.org/en/projects-operations/document-detail/P179109?type=projects',
    'https://projects.worldbank.org/en/projects-operations/document-detail/P179278?type=projects'
]

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 15)  # 延长等待时间适配页面加载速度
results = []

for url in urls:
    driver.get(url)
    
    # 使用EC.or_等待两个条件之一:表格行可见,或无数据提示可见
    wait.until(
        EC.or_(
            EC.visibility_of_element_located((By.CSS_SELECTOR, "table.document-table tbody tr")),
            EC.visibility_of_element_located((By.XPATH, "//div[contains(text(), 'No data available.')]"))
        )
    )
    
    # 判断当前页面是有数据还是无数据
    try:
        # 尝试获取无数据提示元素
        no_data = driver.find_element(By.XPATH, "//div[contains(text(), 'No data available.')]")
        results.append({"url": url, "status": "无数据", "content": None})
    except:
        # 有数据时解析表格内容
        table = driver.find_element(By.CSS_SELECTOR, "table.document-table")
        # 利用pandas快速将表格HTML转为DataFrame
        df = pd.read_html(table.get_attribute('outerHTML'))[0]
        results.append({"url": url, "status": "有数据", "content": df})

# 关闭浏览器
driver.quit()

# 输出解析结果
for res in results:
    print(f"URL: {res['url']}")
    print(f"状态: {res['status']}")
    if res['content'] is not None:
        print("表格内容:")
        print(res['content'])
    print("-"*50)

关键改进说明

  • 显式等待逻辑:通过EC.or_实现“等待任一条件满足”,同时监听表格行和无数据提示的可见性,确保覆盖所有场景
  • 稳定元素定位:替换动态_ngcontent属性为页面固定的CSS类(如document-table)和文本内容定位,大幅提升代码稳定性
  • 场景分支处理:用try-except判断页面状态,分别处理有数据和无数据的情况,避免运行时报错
  • 表格解析优化:借助pandas.read_html直接将表格HTML转为DataFrame,简化数据提取与后续处理逻辑

内容的提问来源于stack exchange,提问作者Mohamed Abd ElShafy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:02:42