如何使用Python从无table id的网页提取表格并导出为CSV文件
问题核心原因
目标网站采用前端动态渲染机制,表格数据是浏览器加载基础HTML后,通过JavaScript异步请求接口再渲染到页面上的。你直接用urllib发起静态请求,只能拿到未填充数据的初始框架代码,和浏览器中F12检查到的渲染后完整代码自然不一致,也就无法定位到表格节点。
可行解决思路
方案1:用模拟浏览器工具获取渲染后页面(新手友好,无需分析接口)
直接用Selenium模拟浏览器访问页面,等待JS渲染完成后再提取表格内容,步骤如下:
- 安装依赖包:
pip install selenium webdriver-manager pandas
- 可直接运行的参考代码:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager 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 # 启动无头浏览器(不弹出窗口,不需要的话可以去掉options配置) options = webdriver.ChromeOptions() options.add_argument("--headless=new") options.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) driver.get("https://lunarcrush.com/exchanges") # 等待表格渲染完成,最长等待10秒 try: table = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "MuiTable-root")) ) # 提取表头 headers = [th.text.strip() for th in table.find_elements(By.XPATH, ".//thead//th")] # 提取行数据 rows = [] for tr in table.find_elements(By.XPATH, ".//tbody//tr"): row = [td.text.strip() for td in tr.find_elements(By.XPATH, "./td")] if row: rows.append(row) # 生成CSV df = pd.DataFrame(rows, columns=headers) df.to_csv("lunarcrush_exchanges.csv", index=False, encoding="utf-8-sig") print("CSV生成完成,共提取{}条数据".format(len(rows))) finally: driver.quit()
方案2:直接请求数据接口(效率更高,适合每日定时运行)
打开浏览器F12开发者工具,切换到「网络」面板,筛选「Fetch/XHR」请求,刷新页面后就能找到返回表格JSON数据的接口,直接请求该接口即可拿到结构化数据,不需要解析HTML,处理起来更高效,也不会受页面元素变动影响。
你原有代码的问题
除了静态请求拿不到渲染内容之外,你的XPath选择器也存在错误:你选择的是MuiTableHead-root下的tr,这个类对应的是表格表头容器,只能拿到表头行,拿不到表格主体的内容行。
内容的提问来源于stack exchange,提问作者Maria P.
相关产品推荐
相关产品推荐

