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

使用Pandas read_html爬取表格返回空DataFrame及Selenium超时问题求助

问题与解决方案

问题背景

尝试爬取DBAASP网站的搜索结果表格:

  1. 首先使用pd.read_html直接请求URL,返回空DataFrame:
url = 'https://dbaasp.org/search?id.value=&name.value=&sequence.value=&sequence.option=full&sequenceLength.value=&complexity.value=&synthesisType.value=Nonribosomal&uniprot.value=&nTerminus.value=&cTerminus.value=&unusualAminoAcid.value=&intraChainBond.value=&interChainBond.value=&coordinationBond.value=&threeDStructure.value=&kingdom.value=&source.value=&hemolyticAndCytotoxicActivitie.value=on&synergy.value=&articleAuthor.value=&articleJournal.value=&articleYear.value=&articleVolume.value=&articlePages.value=&articleTitle.value='
pep_table = pd.read_html(url)

输出:

pep_table
[Empty DataFrame
Columns: [ID, Name, N terminus, Sequence, C terminus, View]
Index: []]
  1. 改用Selenium WebDriver时出现超时错误:
chromedriver = '/usr/local/bin/chromedriver'
driver = webdriver.Chrome(chromedriver)  
driver.get(url)
table = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#DataTables_Table_0_info")))  
tableRows = table.get_attribute("outerHTML")
df = pd.read_html(tableRows)[0]

错误信息:

File "/home/es/anaconda3/envs/pyg-env/lib/python3.7/site-packages/selenium/webdriver/support/wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

问题解答

1. 是否使用了错误的选择器?

是,你用的选择器完全错误。#DataTables_Table_0_info是页面底部显示分页信息的元素(比如"Showing 1 to 10 of 123 entries"),不是表格本身。实际表格的ID是DataTables_Table_0。

2. 该搜索结果页是否需要添加更多选择器?

不需要额外选择器,但需要确保等待的是正确的表格元素,同时要处理表格的动态加载特性(数据是通过JavaScript异步加载的,页面初始HTML没有实际数据)。

3. 如何解决此问题?

核心思路:

  • 用Selenium等待正确的表格元素加载完成
  • 提取表格的HTML后用pandas解析
  • 处理动态加载的等待逻辑

修正后的代码:

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
import pandas as pd

url = 'https://dbaasp.org/search?id.value=&name.value=&sequence.value=&sequence.option=full&sequenceLength.value=&complexity.value=&synthesisType.value=Nonribosomal&uniprot.value=&nTerminus.value=&cTerminus.value=&unusualAminoAcid.value=&intraChainBond.value=&interChainBond.value=&coordinationBond.value=&threeDStructure.value=&kingdom.value=&source.value=&hemolyticAndCytotoxicActivitie.value=on&synergy.value=&articleAuthor.value=&articleJournal.value=&articleYear.value=&articleVolume.value=&articlePages.value=&articleTitle.value='

# 初始化浏览器(确保ChromeDriver版本与本地Chrome一致)
driver = webdriver.Chrome()
driver.get(url)

try:
    # 等待表格可见(延长等待时间到20秒,确保数据加载完成)
    table = WebDriverWait(driver, 20).until(
        EC.visibility_of_element_located((By.ID, "DataTables_Table_0"))
    )
    # 提取表格的完整HTML
    table_html = table.get_attribute("outerHTML")
    # 用pandas解析表格数据
    df = pd.read_html(table_html)[0]
    # 打印前5行验证结果
    print(df.head())
finally:
    # 无论成功与否都关闭浏览器
    driver.quit()

补充说明:

  • pd.read_html失败的原因:该表格是动态渲染的,页面初始HTML仅包含表格框架,实际数据是通过AJAX请求加载的,直接请求URL无法获取到动态加载的内容。
  • 额外优化:如果需要爬取多页数据,可以在获取第一页数据后,定位分页栏的"Next"按钮,循环点击并提取每页数据,直到按钮不可用为止。
  • 注意事项:ChromeDriver版本必须与本地安装的Chrome浏览器版本匹配,否则会出现启动失败或兼容性问题。

内容的提问来源于stack exchange,提问作者S.EB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:05:17