使用Pandas read_html爬取表格返回空DataFrame及Selenium超时问题求助
问题与解决方案
问题背景
尝试爬取DBAASP网站的搜索结果表格:
- 首先使用
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: []]
- 改用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
相关产品推荐
相关产品推荐

