使用pandas read_html读取英空气质量数据遇解析错误及转DataFrame问题
解决pandas read_html解析英国空气质量数据的错误
核心问题原因
网页中的表格存在非标准结构(比如合并单元格、列数不一致的行),导致默认解析器无法正确识别,触发ParserError;而read_html返回列表是因为页面可能包含多个表格元素,需要手动选取目标表格。
具体解决步骤
- 指定更健壮的解析器:使用
lxml解析器替代默认的html.parser,它对不规范HTML表格的兼容性更好。 - 跳过错误行:通过
on_bad_lines参数(pandas 1.4+版本)跳过解析失败的行,旧版本可使用error_bad_lines=False。 - 精准匹配目标表格:用
match参数匹配表格内的关键词(比如"Date"或"DAQI"),直接定位需要的表格。 - 从列表中提取DataFrame:
read_html返回的列表中,选取对应索引的元素转为DataFrame。
代码示例
import pandas as pd # 目标网页链接 url = "https://uk-air.defra.gov.uk/data/DAQI-regional-data?regionIds%5B%5D=999&aggRegionId%5B%5D=999&datePreset=6&startDay=01&startMonth=01&startYear=2022&endDay=01&endMonth=01&endYear=2023&queryId=&action=step2&go=Next+" # 方案1:指定解析器并自动跳过错误行 dfs = pd.read_html(url, flavor="lxml", on_bad_lines="skip") # 查看找到的表格数量,确认目标表格索引 print(f"页面共找到 {len(dfs)} 个表格") # 假设第一个表格是目标数据,转为DataFrame target_df = dfs[0] # 方案2:匹配包含特定关键词的表格(比如"Date"列) dfs = pd.read_html(url, flavor="lxml", match="Date") if dfs: target_df = dfs[0] # 可选:检查数据结构 print(target_df.info())
额外提示
如果跳过错误行后仍有数据异常,可以用skiprows参数手动跳过指定行(比如报错提示的第7行,对应索引为6,用skiprows=range(6)跳过前6行);如果表格有多层表头,可使用header参数指定表头行号。
内容的提问来源于stack exchange,提问作者elksie5000
相关产品推荐
相关产品推荐

