使用read_html解析足球预测网站表格时遇ValueError:未找到表格求助
解决read_html无法解析表格的问题
我看了你的代码和提供的table_html片段,问题主要出在两个地方:一是HTML语法错误(thead里有个<th>标签的属性引号没闭合),二是read_html需要完整的<table>标签包裹内容,而你只传递了innerHTML(缺少外层的<table>标签)。下面是具体的修复方案:
方案一:修复HTML并传递完整表格结构
先获取完整的table元素外层HTML,修复语法错误后再用read_html解析:
import pandas as pd from selenium import webdriver driver = webdriver.Chrome(executable_path="C:/Users/Admin/Documents/chromedriver_win32/chromedriver") link = "https://projects.fivethirtyeight.com/soccer-predictions/super-lig/" driver.get(link) # 获取包含完整<table>标签的outerHTML,而非仅innerHTML table = driver.find_element_by_xpath('//*[@id="forecast-table"]') table_html = table.get_attribute('outerHTML') # 修复原HTML中未闭合的引号错误 table_html = table_html.replace('class="top bordered nosort colspan="4"', 'class="top bordered nosort" colspan="4"') # 解析表格并提取目标DataFrame dfs = pd.read_html(table_html) df = dfs[0] print(df.head()) driver.quit()
方案二:用BeautifulSoup手动提取数据(更稳定)
如果还是遇到解析问题,手动提取数据构建DataFrame的方式更可靠,不受HTML小错误影响:
import pandas as pd from selenium import webdriver from bs4 import BeautifulSoup driver = webdriver.Chrome(executable_path="C:/Users/Admin/Documents/chromedriver_win32/chromedriver") link = "https://projects.fivethirtyeight.com/soccer-predictions/super-lig/" driver.get(link) table = driver.find_element_by_xpath('//*[@id="forecast-table"]') soup = BeautifulSoup(table.get_attribute('outerHTML'), 'html.parser') # 提取表头(处理嵌套的span文本) headers = [] for th in soup.find('thead').find_all('th'): text = th.get_text(strip=True) if not text: text = th.find('span').get_text(strip=True) headers.append(text) # 提取每一行的数据 rows = [] for tr in soup.find('tbody').find_all('tr'): row_data = [td.get_text(strip=True) for td in tr.find_all('td')] rows.append(row_data) # 构建DataFrame df = pd.DataFrame(rows, columns=headers) print(df.head()) driver.quit()
关键提示:
outerHTML会返回包含<table>标签的完整结构,这是read_html识别表格的必要前提。- 原HTML中的语法错误(未闭合的属性引号)会直接导致解析失败,必须先修复。
- 手动提取数据的方式更适配动态渲染的复杂表格,稳定性更高。
内容的提问来源于stack exchange,提问作者wazo
相关产品推荐
相关产品推荐

