Python爬取Worldometer疫情表格出现列数不匹配AssertionError如何解决
问题原因
- 目标站点Worldometer的疫情表格结构不定期调整,你代码中对表头做了
[1:]切片后得到的列数,与实际爬取的行数据列数不一致 - 表格内包含全球、各大洲汇总的特殊行,存在单元格合并属性,导致这些行的
td数量少于普通国家行,触发pandas列数不匹配的AssertionError - 你仅对表头做了首列丢弃,行数据没有做对应的切片处理,也是列数不匹配的诱因之一
修复方案
直接替换为以下可运行代码:
import requests from bs4 import BeautifulSoup import pandas as pd headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 移除冗余的utm参数,避免页面跳转影响结构 r = requests.get("https://www.worldometers.info/coronavirus/", headers=headers) soup = BeautifulSoup(r.content, "lxml") table = soup.find("table", id="main_table_countries_yesterday") # 直接获取所有表头,不提前切片 header = [th.get_text(strip=True) for th in table.select("thead tr th")] header_length = len(header) all_data = [] for row in table.select("tbody tr:not([style*='display: none'])"): tds = [td.get_text(strip=True) for td in row.select("td")] # 过滤列数不匹配的无效行,也可根据需要调整补全逻辑 if len(tds) == header_length: all_data.append(tds) df = pd.DataFrame(all_data, columns=header) # 如果需要丢弃首列序号列,在这里统一处理 df = df.drop(df.columns[0], axis=1) print(df) df.to_csv("data.csv", index=False, encoding='utf_8_sig')
核心调整点
- 移除了URL冗余的utm参数,避免页面重定向导致结构异常
- 统一先获取完整表头长度,行数据匹配长度后再存入列表,自动过滤合并单元格的无效汇总行
- 统一在DataFrame生成后丢弃首列,避免表头和行数据切片逻辑不一致的问题
- 导出csv指定utf_8_sig编码,避免中文乱码
内容的提问来源于stack exchange,提问作者Arslan Aziz
相关产品推荐
相关产品推荐

