Python使用pandas.read_html爬取表格报ValueError: No tables found求助
报错核心原因
该报错不属于BeautifulSoup的错误,是pandas read_html方法的解析规则与传入内容不匹配导致的,两类场景的修复方案如下:
第一个场景修复
错误点:你传入了#nav-yesterday整个div节点的序列化内容,多余的DOM结构会干扰pandas的表格识别逻辑,且未携带请求头容易触发站点反爬,返回无有效表格的异常页面。
修复后代码:
import pandas as pd import numpy as np import requests from bs4 import BeautifulSoup from datetime import date today = date.today() caption = 'Coronavirus Data {}'.format(today) url = 'https://www.worldometers.info/coronavirus/' # 模拟浏览器请求头,避免反爬 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } r = requests.get(url, headers=headers) html_doc = r.text soup = BeautifulSoup(html_doc, "lxml") yesterday = soup.find('div', attrs={'id':'nav-yesterday'}) # 直接定位目标table节点后再传入pandas target_table = yesterday.find("table") dfs = pd.read_html(str(target_table), flavor = 'bs4')[0] print(dfs)
第二个场景修复
错误点:你已经定位到了目标table节点,但仍传入了整个页面的序列化内容,页面内其他不规范的DOM结构会干扰pandas解析。
修复后代码:
import pandas as pd import numpy as np import requests from bs4 import BeautifulSoup url = 'https://www.stadiumsofprofootball.com/comparisons/' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } r = requests.get(url, headers=headers) text = r.text soup = BeautifulSoup(text, "lxml") table = soup.find_all('table')[0] # 仅传入目标table的序列化内容 df = pd.read_html(str(table))[0] print(df)
通用排查要点
- 所有爬虫请求必须携带
User-Agent参数,避免站点反爬返回无效页面 - 已通过BeautifulSoup定位到目标table的情况下,直接传入该节点的字符串形式,不要传入上层节点或全页内容
- 若仍解析失败,可给
read_html添加header=None参数,跳过pandas的表头校验逻辑
内容的提问来源于stack exchange,提问作者Paul Kearney
相关产品推荐
相关产品推荐

