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
相关产品推荐
相关产品推荐

