使用Pandas爬取合并多页网页表格时触发HTTP Error 400报错求助
错误原因
你的代码存在两个核心问题,直接触发400报错和后续逻辑错误:
- 字符串格式化顺序写反:你写的
pd.read_html(url).format(i)是先请求带{}占位符的无效URL,再对返回结果做格式化,正确顺序是先用format把页码拼接到URL中,再发起请求,无效URL自然会返回400错误。 pd.read_html()的返回值是页面内所有表格组成的列表,不是单个DataFrame,直接append会把列表存入数组,后续合并会报错,需要指定要提取的表格对应的索引(这类列表页的目标表格一般是索引为0的第一个表格)。- 原代码没有实现最终的多表合并逻辑,循环结束后仅把每页表格存到了列表中,没有拼接成完整的DataFrame。
修正代码
import pandas as pd import ssl ssl._create_default_https_context = ssl._create_unverified_context dfs = [] base_url = 'https://www.emporis.com/city/100422/singapore-singapore/status/all-buildings/{}' for i in range(1, 3): # 先拼接当前页码,生成有效请求URL current_url = base_url.format(i) # 读取页面所有表格,取第一个目标表格 page_df = pd.read_html(current_url)[0] dfs.append(page_df) # 纵向合并所有分页表格,重置索引 final_merged_df = pd.concat(dfs, ignore_index=True) print(final_merged_df.head(15))
补充说明
如果爬取更多页码时出现403、连接超时类问题,是网站反爬机制拦截了pandas默认的请求标识,此时可以先用requests库构造带常规浏览器User-Agent的请求拿到页面HTML源码,再把源码传入pd.read_html()做解析即可。爬取前请遵守目标网站的访问规则,控制请求频率。
内容的提问来源于stack exchange,提问作者naratetama
相关产品推荐
相关产品推荐

