
本文介绍如何使用beautifulsoup精准定位并提取挪威天气网站(yr.no)中指定区域(如jordalen - nåsen)的雪深值,并将其结构化为pandas dataframe,支持多行多列表格解析与类型安全转换。
本文介绍如何使用beautifulsoup精准定位并提取挪威天气网站(yr.no)中指定区域(如jordalen - nåsen)的雪深值,并将其结构化为pandas dataframe,支持多行多列表格解析与类型安全转换。
要从 yr.no 雪深页面 提取结构化雪深数据(而不仅是单个 文本),关键在于识别页面真实的HTML结构:它并非简单罗列独立span标签,而是以响应式表格( 因此,直接使用 find_all("span", {"class": "snow-depth__value"}) 会返回全部雪深值但丢失归属关系(无法知道哪个值属于哪个地点)。更稳健的做法是按表格逻辑解析整张二维数据表: 以下是完整、可运行的生产级代码: 通过该方法,你不仅能精准获取 Jordalen - Nåsen 的雪深,还能一次性加载整个Vestland地区的结构化观测数据,为时间序列分析、地理可视化或自动化预警提供可靠数据源。语义化变体)组织——每行代表一个观测点(如Jordalen - Nåsen),每列对应不同时间维度(如24h、48h、累计雪深等)。
✅ 正确解析策略
):提取列名(如“Sted”、“24 t”、“48 t”、“Totalt”); ):筛选带 fluid-table__row--link 类的行(即有效观测点); 或
子元素;
from bs4 import BeautifulSoup
import requests
import pandas as pd
# 获取网页内容
url = 'https://www.php.cn/link/37bc3d1076fca822d98e539754dae9cd'
response = requests.get(url, timeout=10)
response.raise_for_status() # 确保请求成功
soup = BeautifulSoup(response.content, 'html.parser')
# 提取表头(列名)
headers = [th.get_text(strip=True) for th in soup.find_all('th', class_='fluid-table__cell--heading')]
# 提取所有数据行(每个观测点一行)
rows = soup.find_all('tr', class_='fluid-table__row fluid-table__row--link')
# 构建行数据生成器:每行是一个字符串列表
def extract_row_texts(row):
return [td.get_text(strip=True) for td in row.find_all(['td', 'th'])]
data = [extract_row_texts(row) for row in rows]
# 创建DataFrame(自动对齐列数,空缺处填充NaN)
df = pd.DataFrame(data, columns=headers)
# 可选:尝试将雪深列转为数值(处理“–”或空值)
snow_cols = [col for col in df.columns if 't' in col.lower() or 'total' in col.lower()]
for col in snow_cols:
df[col] = pd.to_numeric(df[col].str.replace(r'[^\d\-]', '', regex=True), errors='coerce')
print(df.head())
# 示例输出(可能含Jordalen - Nåsen行):
# Sted 24 t 48 t ... Totalt
# 0 Jordalen - Nåsen 25 30 ... 85
⚠️ 注意事项
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
requests.get(url, headers=headers)











