如何将网站表格数据导出至CSV?代码报错“ValueError: No table found”
问题原因
之前能用的pd.read_html突然报错,核心原因是目标网站的页面结构变了——要么原来的标准HTML表格被替换成了非table标签的布局,要么表格数据改成了JavaScript动态加载,导致pandas直接抓不到静态HTML里的表格。
解决办法
方法1:用Selenium模拟浏览器抓动态内容
如果表格是JS加载的,就得先让浏览器渲染完页面再抓:
import pandas as pd from selenium import webdriver from selenium.webdriver.chrome.options import Options import datetime # 配置无头模式,不用弹出浏览器窗口 chrome_options = Options() chrome_options.add_argument("--headless=new") driver = webdriver.Chrome(options=chrome_options) try: url = 'https://www.comed.com/smart-energy/my-green-power-connection/developers-contractors/smaller-generators/interconnection-queue' driver.get(url) # 等10秒让页面加载完,时间可以自己调 driver.implicitly_wait(10) # 抓渲染后的页面源码 page_source = driver.page_source # 再用pandas解析表格 tables = pd.read_html(page_source) if tables: queue_pd = tables[0] # 导出带当前日期的CSV queue_pd.to_csv(f'interconnection_queue_{datetime.datetime.now().strftime("%Y%m%d")}.csv', index=False) print("导出成功") else: print("页面里没找到表格") finally: # 用完关掉浏览器 driver.quit()
先装依赖:pip install selenium,还要对应装Chrome浏览器的驱动(ChromeDriver)。
方法2:直接抓网站的API接口(更高效)
打开浏览器按F12进开发者工具,切到「网络」标签,刷新页面,找XHR/Fetch类型的请求,里面大概率有直接返回表格数据的API。找到后直接用requests调用:
import pandas as pd import requests import datetime # 替换成你找到的API地址 api_url = "这里填找到的API接口URL" resp = requests.get(api_url) if resp.status_code == 200: data = resp.json() # 按API返回的JSON结构转成DataFrame queue_pd = pd.DataFrame(data) queue_pd.to_csv(f'interconnection_queue_{datetime.datetime.now().strftime("%Y%m%d")}.csv', index=False) else: print("API请求失败")
这种方法速度快,不用模拟浏览器,但得自己找对接口。
方法3:用BeautifulSoup手动解析非标准表格
如果页面用div之类的标签模拟表格,pd.read_html就失效了,得手动提取:
import pandas as pd import requests from bs4 import BeautifulSoup import datetime url = 'https://www.comed.com/smart-energy/my-green-power-connection/developers-contractors/smaller-generators/interconnection-queue' resp = requests.get(url) soup = BeautifulSoup(resp.text, 'html.parser') # 这里要根据页面实际结构改选择器,比如找包裹表格的div类名 table_rows = soup.select('div.table-wrapper div.table-row') data = [] for row in table_rows: # 提取每行的单元格文本 cells = row.select('div.table-cell') row_data = [cell.get_text(strip=True) for cell in cells] data.append(row_data) if data: # 假设第一行是表头 headers = data[0] queue_pd = pd.DataFrame(data[1:], columns=headers) queue_pd.to_csv(f'interconnection_queue_{datetime.datetime.now().strftime("%Y%m%d")}.csv', index=False) else: print("没提取到表格数据")
这个方法需要你对着页面源码调整CSS选择器,匹配当前的表格结构。
先做这几步排查
- 直接打开目标网址,确认表格还在不在
- 右键看页面源代码,搜
<table>标签,确认有没有标准表格 - 要是源码里没table,那肯定是动态加载的,优先用方法1或2
内容的提问来源于stack exchange,提问作者user22062084
相关产品推荐
相关产品推荐

