HTML爬取Pandas DataFrame异常:仅获最后一行及多表合并求助
解决HTML表格爬取到DataFrame仅存最后一行及多表格合并问题
我看了你这段爬取Agmarknet数据的代码,发现几个关键问题导致你只拿到最后一行数据,而且多表格合并的需求也没实现。咱们一步步来修正:
问题根源分析
- 固定DataFrame行数且未递增行标记:你一开始创建了固定1000行的DataFrame,但处理每行数据后没有让
row_marker自增,所有行都被写入第0行,最后只剩最后一行数据;同时固定行数也不够灵活,容易丢失超出行数限制的数据。 - 循环中重复覆盖DataFrame:每次循环商品ID时,你都重新初始化了
DataAll,之前爬取的数据会被直接覆盖,最终只保留最后一个商品的表格内容。 - 复用旧请求内容:循环里你一直用第一次请求的
Res.content,没有针对新URL发起新请求,等于每次都在解析同一个页面,数据自然不对。
修正后的完整代码
import sys, csv, os import pandas as pd from bs4 import BeautifulSoup import requests Export_Path = r"E:\Knoema_Work_Dataset" # 初始化总列表,用来收集所有商品的表格数据 all_data = [] # 要爬取的商品ID列表 commodity_ids = ['137','281','325','166','86','130'] for commodity_id in commodity_ids: # 构造正确的请求URL,修正原代码中的参数拼接错误 url = f'https://agmarknet.gov.in/SearchCmmMkt.aspx?Tx_Commodity={commodity_id}&Tx_State=0&Tx_District=0&Tx_Market=0&DateFrom=01-jan-2016&DateTo=19-nov-2019&Fr_Date=01-jan-2016&To_Date=19-nov-2019&Tx_Trend=2&Tx_CommodityHead=Ajwan&Tx_StateHead=--Select--&Tx_DistrictHead=--Select--&Tx_MarketHead=--Select--' # 针对当前商品ID发起新的HTTP请求 res = requests.get(url) soup = BeautifulSoup(res.content, 'lxml') # 定位目标表格 table = soup.find('table', {'class':'tableagmark_new'}) if table: # 确保找到表格再处理,避免报错 # 遍历表格的每一行 for row in table.find_all('tr'): columns = row.find_all('td') # 过滤表头行(表头用th标签,数据行用td标签) if columns: # 提取每个单元格的文本,去除多余空格和换行 row_data = [col.get_text(strip=True) for col in columns] # 将该行数据加入总列表 all_data.append(row_data) # 将所有收集到的数据转换成DataFrame df = pd.DataFrame(all_data, columns=[ 'State Name','District Name','Market Name','Variety','Group', 'Arrivals (Tonnes)','Min Price (Rs./Quintal)','Max Price (Rs./Quintal)', 'Modal Price (Rs./Quintal)','Reported Date' ]) # 保存合并后的DataFrame到CSV文件 Export_Path_F = os.path.join(Export_Path, 'aggr.csv') df.to_csv(Export_Path_F, encoding='utf-8-sig', index=False)
关键修改说明
- 用列表动态收集数据:不再提前创建固定大小的DataFrame,而是用
all_data列表逐行累加所有商品的数据,最后统一转换为DataFrame,既灵活又避免数据覆盖。 - 每次循环发起新请求:针对每个商品ID的URL重新发起请求,确保解析的是当前商品的页面内容。
- 过滤表头行:通过判断是否存在
td元素,自动跳过表格的表头行,只保留有效数据。 - 清理文本格式:用
strip=True去除单元格文本中的多余空格和换行,让数据更整洁。
内容的提问来源于stack exchange,提问作者pavanas poojary
相关产品推荐
相关产品推荐

