使用BeautifulSoup提取Nordpool网站表格并转Pandas DataFrame遇阻求助
问题原因与解决方法
原因说明
- 目标网站的表格是动态渲染的:页面初始HTML里的
table只是一个空占位符,实际表格数据是通过前端JavaScript调用后端API获取后,再填充到页面中的。requests.get()只能获取到页面的初始静态HTML,拿不到JS加载后的动态内容,所以只能看到空的table标签。 - 之前的代码在其他网站生效,是因为那些网站的表格是静态嵌入在HTML里的,请求页面时就能直接拿到完整表格内容。
解决建议
方法1:直接调用后端API(推荐,效率更高)
网站的动态数据都是通过API接口返回的,你可以直接请求这些接口获取原始数据,无需解析HTML:
- 打开浏览器开发者工具(按F12),切换到「Network」标签页;
- 刷新目标页面,筛选「XHR」或「Fetch」类型的请求;
- 找到返回表格数据的请求,复制其URL(比如Nordpool的市场数据接口通常类似
https://www.nordpoolgroup.com/api/marketdata/page/10?currency=,,,EUR); - 用
requests请求该API,解析返回的JSON数据并转为DataFrame。
示例代码:
import pandas as pd import requests # 替换为你抓包得到的实际API地址 api_url = "https://www.nordpoolgroup.com/api/marketdata/page/10?currency=,,,EUR" response = requests.get(api_url) response.raise_for_status() # 检查请求是否成功 data = response.json() # 解析JSON结构,提取表格数据(根据实际返回结构调整) table_rows = data["data"]["Rows"] df = pd.DataFrame(table_rows) print(df.head())
方法2:用Selenium模拟浏览器加载动态内容
如果不想抓API,可以用Selenium模拟浏览器完整加载页面(包括JS执行),再提取表格:
- 安装依赖:
pip install selenium; - 下载对应浏览器的驱动(比如ChromeDriver),并确保其在系统PATH中;
- 编写代码等待表格加载完成后提取内容。
示例代码:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import pandas as pd url = "https://www.nordpoolgroup.com/en/Market-data1/#/nordic/table" # 初始化Chrome浏览器 driver = webdriver.Chrome() driver.get(url) # 等待表格加载完成(最多等待10秒) wait = WebDriverWait(driver, 10) table_element = wait.until(EC.presence_of_element_located((By.TAG_NAME, "table"))) # 提取表格HTML并转为DataFrame table_html = table_element.get_attribute("outerHTML") df = pd.read_html(table_html)[0] print(df.head()) # 关闭浏览器 driver.quit()
内容的提问来源于stack exchange,提问作者Vibramat
相关产品推荐
相关产品推荐

