You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修改说明

  1. 用列表动态收集数据:不再提前创建固定大小的DataFrame,而是用all_data列表逐行累加所有商品的数据,最后统一转换为DataFrame,既灵活又避免数据覆盖。
  2. 每次循环发起新请求:针对每个商品ID的URL重新发起请求,确保解析的是当前商品的页面内容。
  3. 过滤表头行:通过判断是否存在td元素,自动跳过表格的表头行,只保留有效数据。
  4. 清理文本格式:用strip=True去除单元格文本中的多余空格和换行,让数据更整洁。

内容的提问来源于stack exchange,提问作者pavanas poojary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:43:07