You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Pandas读取HTML表格报错ValueError: No tables found 求助排查

解决pd.read_html无法解析'Live Odds Comparison'表格的问题

我来帮你分析问题并给出针对性解决方案:

可能的原因

  1. 定位元素不完整:你之前的代码定位的是<tbody>元素,虽然pd.read_html偶尔能识别单独的<tbody>,但'Live Odds Comparison'表格的结构可能更复杂,pandas的解析器需要完整的<table>标签才能正确识别表格边界。
  2. 嵌套HTML干扰:这个表格的单元格里可能嵌套了大量<div><span>等非表格标签,即使outerHTML看起来正常,这些嵌套元素也会打乱pandas对表格结构的识别逻辑。
  3. 参数不匹配:你之前用的skiprows=(0,2)是针对'Head to Head Statistics'的行结构设置的,不适用于'Live Odds Comparison'表格,错误的行跳过规则导致解析时丢失关键结构信息。

解决办法

方法1:定位完整的<table>元素

修改XPath,找到包含目标文本的<tbody>的父级<table>,确保传递给pd.read_html的是完整的表格HTML:

name='Live Odds Comparison' 
# 定位到包含目标tbody的table元素
table_element = WebDriverWait(browser,10).until( 
    EC.presence_of_element_located((By.XPATH,'''//tbody[descendant::*[contains(text(),"{}")]]/parent::table'''.format(name)))) 
# 读取表格,去掉不适用的skiprows参数
tablas = pd.read_html(table_element.get_attribute('outerHTML'), header=0)[0]

方法2:手动包裹表格标签

如果无法直接定位到<table>,可以手动用<table>标签包裹你获取到的<tbody> HTML:

name='Live Odds Comparison' 
tabla=WebDriverWait(browser,10).until( 
    EC.presence_of_element_located((By.XPATH,'''//tbody[descendant::* [contains(text(),"{}")]]'''.format(name)))) 
# 包裹tbody为完整的table结构
full_table_html = f"<table>{tabla.get_attribute('outerHTML')}</table>"
# 尝试解析,根据表格实际结构调整header参数
tablas = pd.read_html(full_table_html, header=0)[0]

方法3:清理嵌套的HTML元素

如果表格里有大量嵌套标签干扰解析,可以用BeautifulSoup先清理HTML:

from bs4 import BeautifulSoup

name='Live Odds Comparison' 
tabla=WebDriverWait(browser,10).until( 
    EC.presence_of_element_located((By.XPATH,'''//tbody[descendant::* [contains(text(),"{}")]]'''.format(name)))) 

# 解析并清理HTML,移除干扰标签
soup = BeautifulSoup(tabla.get_attribute('outerHTML'), 'html.parser')
# 移除单元格内的div/span等标签,保留文本内容
for tag in soup.find_all(['div', 'span']):
    tag.unwrap()

# 包裹为完整表格并解析
cleaned_table_html = f"<table>{str(soup)}</table>"
tablas = pd.read_html(cleaned_table_html, header=0)[0]

方法4:调整pd.read_html参数

尝试去掉skiprows,或者指定解析器类型,适配表格结构:

# 去掉skiprows,让pandas自动识别表头
tablas = pd.read_html(full_table_html, header=0)[0]
# 或者指定使用bs4解析器,提升兼容性
tablas = pd.read_html(full_table_html, header=0, flavor='bs4')[0]
# 如果表头不在第一行,可调整header参数,比如header=1
tablas = pd.read_html(full_table_html, header=1)[0]

内容的提问来源于stack exchange,提问作者puppet

火山引擎 最新活动