优化网页抓取数据的分离方法及Pandas表格处理咨询
更优的数据分离方法(BeautifulSoup版)
别用手动定位索引的方式,太依赖固定位置,网页结构一变就崩。直接基于表格的行/单元格结构提取更靠谱:
- 先定位到目标表格(比如用
soup.find('table', attrs={'id': '目标表格ID'}),没有ID就用class或其他属性筛选) - 遍历表格的每一行(跳过表头行):
table = soup.find('table', id='inflation-table') data = [] # 跳过表头,从第二行开始遍历 for row in table.find_all('tr')[1:]: cells = row.find_all('td') # 确保当前行有足够的单元格 if len(cells) >= 3: year = cells[0].text.strip() avg_inflation = cells[1].text.strip() dec_inflation = cells[2].text.strip() data.append({'年份': year, '年均通胀率': avg_inflation, '12月通胀率': dec_inflation}) - 这种方式直接对应单元格的语义位置,哪怕表格加了辅助列/调整顺序,只要核心数据的位置不变就没问题,比手动索引灵活得多。
pd.read_html获取的DataFrame处理步骤
先搞清楚DataFrame的结构,再一步步清理:
- 查看基础结构:先运行
print(df.head())和df.info(),确认有没有多余的空行、表头错位、非数值数据等问题。 - 清理无效行/列:
- 去掉全空的行/列:
df = df.dropna(how='all', axis=0)(清理行)、df = df.dropna(how='all', axis=1)(清理列) - 如果表头错位(比如表头在第二行),重置表头:
df.columns = df.iloc[0] # 把第一行设为列名 df = df[1:] # 删除原来的表头行 df = df.reset_index(drop=True) # 重置索引
- 去掉全空的行/列:
- 修正数据类型:把通胀率列转成数值型(方便后续计算):
# 先去掉百分号,再转数值,无效值设为NaN df['年均通胀率'] = pd.to_numeric(df['年均通胀率'].str.replace('%', ''), errors='coerce') df['12月通胀率'] = pd.to_numeric(df['12月通胀率'].str.replace('%', ''), errors='coerce') - 提取目标数据:直接筛选需要的列即可,顺便去掉有缺失值的行:
target_df = df[['年份', '年均通胀率', '12月通胀率']].dropna()
内容的提问来源于stack exchange,提问作者user4356954
相关产品推荐
相关产品推荐

