首页 > 解决方案 > 使用 For 循环创建一个列表,然后使用 Pandas 导出到 Excel

问题描述

早上好,

我已经为此工作了大约 3 天。我需要帮助。

我正在使用 BeautifulSoup 来解析它。我正在做的所有事情一直到:

df = pd.DataFrame({'Name':[Var1]})
df.append([Var1], ignore_index=False)
df.to_excel(writer, sheet_name='Names', index=False, header=True, startrow=start_row)

我一共抓取了 X 个变量并剥离了它们。可能是 3,也可能是 100。我想做的是抓住它们并将它们写入格式如下的 excel 表中:

姓名

变量1

变量1

变量1

变量1

我遇到的问题是它只写最后一个条目,即使我可以使用:

print(df)

并查看 10 个条目。

这就是为什么我认为也许一份清单会更容易。如果我能弄清楚如何遍历 for 循环并创建一个列表,其中 list=[Var1, Var1, Var1...] 我可以将该列表放入:

df = pd.DataFrame({'Name':[Var1]})

虽然现在看可能行不通。

import requests  
import sys
import re  
import pandas as pd  
from bs4 import BeautifulSoup  

page = requests.get('https://thisisanexampleurl.com')

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

start_row = 0

writer = pd.ExcelWriter('my_excel_sheet.xlsx', engine='openpyxl')

for link in soup.find_all('h3'):

    Var1 = link.get_text() #grabbing a header string with a Name in it
    Var1 = Var1.strip() #stripping out leading/ending spaces because there's a ton


    df = pd.DataFrame({'Name':[Var1]})
    df.append([Var1], ignore_index=False)
    df.to_excel(writer, sheet_name='Names', index=False, header=True, startrow=start_row)

我意识到这一点很糟糕,但我很感激任何和所有的帮助。

非常感谢。

标签: pythonpython-3.xpandasfor-loop

解决方案


您需要将在循环Var1的每次迭代中获得的每一个都for link in soup...放入一个结构(如列表)中,并且只有在循环完成后,您才能将该列表转换为 DataFrame 并将其写入 Excel。否则,每次调用都会df.to_excel一遍又一遍地覆盖同一个 Excel 文件,而您只会看到最后一个已写入的文件。

例如:

vars_list = []
for link in soup.find_all('h3'):
    Var1 = link.get_text() #grabbing a header string with a Name in it
    Var1 = Var1.strip() #stripping out leading/ending spaces because there's a ton
    vars_list.append(Var1)

df = pd.DataFrame({'Name': vars_list})
df.to_excel(writer, sheet_name='Names', index=False, header=True, startrow=start_row)

此外,编写df = pd.DataFrame({'Name':[Var1]})只是创建一个包含单列Name和单行的数据框Var1。即使您可以初始化 DataFrame 并在每次迭代时附加到它,但您在 for 循环中编写的事实df = pd.DataFrame...有效地意味着您的 DataFrame 在每次迭代中都会被覆盖。


推荐阅读