如何从指定URL读取特定表格?Python读取GDP数据遇无表错误
解决方法
你的问题出在pd.read_html只能识别标准HTML <table>标签,而目标网站的GDP数据并非直接以<table>形式嵌入页面,而是存储在页面的JSON脚本中,前端通过JavaScript渲染出表格,所以pandas无法识别。以下是两种可行的解决方法:
方法一:提取页面中的JSON数据(推荐)
网站的核心数据会放在id="__NEXT_DATA__"的script标签里,直接解析这个JSON就能拿到结构化数据,比解析HTML更稳定:
- 先安装依赖库(如果没装的话):
pip install beautifulsoup4 pandas requests
- 代码实现:
import requests import json from bs4 import BeautifulSoup import pandas as pd url = "https://worldpopulationreview.com/countries/by-gdp" # 获取页面内容 response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 定位存储数据的script标签 script_data = soup.find("script", id="__NEXT_DATA__").string # 解析JSON raw_data = json.loads(script_data) # 提取GDP相关数据(路径根据页面JSON结构确定) gdp_list = raw_data["props"]["pageProps"]["data"] # 转换为DataFrame并筛选需要的字段 df = pd.DataFrame(gdp_list) # 保留国家名称、GDP总量、人均GDP字段 filtered_df = df[["country", "gdp", "gdpPerCapita"]] print(filtered_df.head())
方法二:模拟浏览器渲染(适用于完全动态加载的页面)
如果后续网站改为完全动态加载(即r.text里也看不到数据),可以用selenium模拟浏览器加载页面,再提取表格:
- 安装依赖:
pip install selenium pandas
(需要额外下载对应浏览器的驱动,比如ChromeDriver,配置好环境变量)
- 代码示例:
from selenium import webdriver import pandas as pd url = "https://worldpopulationreview.com/countries/by-gdp" # 初始化浏览器(这里以Chrome为例) driver = webdriver.Chrome() driver.get(url) # 直接读取页面中的表格 df_list = pd.read_html(driver.page_source) driver.quit() # 输出第一个表格(也就是GDP数据表格) print(df_list[0].head())
注意事项
- 网站的JSON结构可能会随版本更新变化,如果方法一失效,需要重新查看页面源码,调整JSON数据的提取路径。
- 频繁请求网站可能会触发反爬机制,建议添加请求间隔(比如
time.sleep(2))。
内容的提问来源于stack exchange,提问作者dallascow
相关产品推荐
相关产品推荐

