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

Python循环中向Pandas列写入数据的问题

问题描述

刚接触网页爬虫,现有代码能抓取目标网页的全部数据,但存在问题:循环中打印的position_text值是正确的(依次为ALL、PG、SG、SF、PF、C),但最终DataFrame的["Position"]列只保留了最后一个值"C"。相关代码如下:

df_results = pd.DataFrame()

follow_loop=list(range(1,7))
for i in follow_loop:
    xpath = '//*[@id="main-container"]/div/div/div/div[4]/div[1]/ul/li['
    xpath += str(i)
    xpath += "]"
    driver.find_element(By.XPATH,(xpath)).click()
    
    sleep(2)
   
    driver.execute_script("window.scrollTo(1,1200)")
  
    sleep(2)
    driver.execute_script("window.scrollTo(1,-1200)")
    
    html=driver.page_source

    soup = BeautifulSoup(html,'html.parser')

    stats_table=soup.find(id="data-table")
    
    position='//*[@id="main-container"]/div/div/div/div[4]/div[1]/ul/li['
    position += str(i)
    position += "]"
    position_text = driver.find_element(By.XPATH,(position)).text
    
    df_results = df_results.append(pd.read_html(str(stats_table)))
    df_results["Position"] = position_text
    print(position_text)
    sleep(2)

打印输出:

ALL
PG
SG
SF
PF
C
问题原因与解决办法

核心问题:每次循环中执行df_results["Position"] = position_text时,会把整个Position列的所有行都覆盖为当前的position_text值。循环结束后,最后一次赋值的"C"就会覆盖之前所有行的Position值。

正确的做法是:先给当前循环抓取到的子DataFrame添加Position列,再将这个子DataFrame追加到总DataFrame中,而不是先追加再覆盖整列。修改后的代码如下:

df_results = pd.DataFrame()

follow_loop=list(range(1,7))
for i in follow_loop:
    xpath = '//*[@id="main-container"]/div/div/div/div[4]/div[1]/ul/li['
    xpath += str(i)
    xpath += "]"
    driver.find_element(By.XPATH,(xpath)).click()
    
    sleep(2)
   
    driver.execute_script("window.scrollTo(1,1200)")
  
    sleep(2)
    driver.execute_script("window.scrollTo(1,-1200)")
    
    html=driver.page_source

    soup = BeautifulSoup(html,'html.parser')

    stats_table=soup.find(id="data-table")
    
    position='//*[@id="main-container"]/div/div/div/div[4]/div[1]/ul/li['
    position += str(i)
    position += "]"
    position_text = driver.find_element(By.XPATH,(position)).text
    
    # 读取当前表格为子DataFrame(pd.read_html返回列表,取第一个元素)
    sub_df = pd.read_html(str(stats_table))[0]
    # 给子DataFrame添加对应Position列
    sub_df["Position"] = position_text
    # 将子DataFrame追加到总表,重置索引避免重复
    df_results = df_results.append(sub_df, ignore_index=True)
    
    print(position_text)
    sleep(2)

关键改动说明:

  • pd.read_html()返回的是DataFrame列表,需用[0]取出实际表格数据;
  • 先给子表添加Position列,确保当前抓取的所有行都对应正确的位置值;
  • 追加时加上ignore_index=True,避免循环中出现索引重复的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:25:19