python-3.x - 使用beautifulsoup和pandas抓取时如何将行附加到xlsx文件?
问题描述
所以,我一直在寻找,我似乎无法弄清楚为什么我无法从我的抓取中获得结果以写入 xlsx 文件。
我正在运行 .csv 文件中的 url 列表。我在那里扔了 10 个网址,beautifulsoup 刮掉了它们。如果我只是打印数据框,那是我们的权利。
如果我尝试将结果保存为 xlsx(首选)或 csv,它只会给我最后一个 url 的结果。
如果我运行它,它会打印出完美的
with open('G-Sauce_Urls.csv' , 'r') as csv_file:
csv_reader = csv.reader(csv_file)
for line in csv_reader:
r = requests.get(line[0]).text
soup = BeautifulSoup(r,'lxml')
business = soup.find('title')
companys = business.get_text()
phones = soup.find_all(text=re.compile("Call (.*)"))
Website = soup.select('head > link:nth-child(4)')
profile = (Website[0].attrs['href'])
data = {'Required':[companys], 'Required_no_Email':[phones], 'Business_Fax':[profile] }
df = pd.DataFrame(data, columns = ['Required','First', 'Last', 'Required_no_Email', 'Business_Fax'])
但我似乎无法将其附加到 xlsx 文件中。我只得到最后一个结果,我认为这是因为它只是“写入”而不是附加。
我试过了:
writer = pd.ExcelWriter("ProspectUploadSheetRob.xlsx", engine='xlsxwriter', mode='a')
df.to_excel(writer, sheet_name='Sheet1', index=False, startrow=4, header=3)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
writer.save()
和
with ExcelWriter('path_to_file.xlsx', mode='a') as writer:
df.to_excel(writer, sheet_name='Sheet1', index=False, startrow=4, header=3)
writer.save()
和
df = pd.DataFrame(data, columns = ['Required','First', 'Last', 'Required_no_Email', 'Business_Fax'])
writer = pd.ExcelWriter("ProspectUploadSheetRob.xlsx", engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', index=False, startrow=4, header=3)
writer.save()
和
我开始阅读 openpyxl,但此时我很困惑,我不明白。
任何和所有的帮助表示赞赏
解决方案
您正在逐行迭代您的 csv 数据,但您在每次迭代时都在重新创建数据框,因此您每次都会丢失前一个数据框的值。您需要先在循环之外创建 df,然后在 for 循环中添加数据。
df = pd.DataFrame(columns = ['Required','First', 'Last', 'Required_no_Email', 'Business_Fax'])
>>> df
Empty DataFrame
Columns: [Required, First, Last, Required_no_Email, Business_Fax]
Index: []
您对写入而不是附加的假设是正确的,但是您需要附加数据框,然后将其写入 excel,而不是将数据附加到 excel(如果我理解正确的话)。
data = {'Required':[companys], 'Required_no_Email':[phones], 'Business_Fax':[profile] }
df = df.append(data, ignore_index=True) # use this instead of this part of your original code below:
# df = pd.DataFrame(data, columns = ['Required','First', 'Last', 'Required_no_Email', 'Business_Fax'])
# this will not be required as you have already defined the df outside the loop
pd.ExcelWriter 只会在您运行时产生输出:
writer.save()
我有一个类似的代码,它使用以下参数打开文件并且它可以工作:
writer = pd.ExcelWriter(r'path_to_file.xlsx', engine='xlsxwriter')
... all my modifications ...
writer.save()
请注意,根据文档,'w' 或 Write 是默认模式,在修改对象时也是如此,虽然没有详细解释,但仅在添加全新的 excel 对象(表格等)或“扩展”文档时才引用 append与另一个具有与文档结构完全相同格式的数据框。为了使其可重现,您可以添加一个模板 xlsx,但我希望它有所帮助。请告诉我。
推荐阅读
- c++ - GNU ARM Embedded Toolchain 与具有裸机 ARM 架构的普通 gcc/g++ 之间的区别
- ruby-on-rails - Ruby on Rails - 从孙表中获取记录
- python - 模棱两可的真值 - For 循环和 If 语句
- multithreading - Coordinating threads using shared std::atomic as a counter
- php - 修改 session.save_path 后 session_destroy 不起作用(会话数据保存在服务器上)
- python - 为什么我不能在堆栈中推送多个数字来计算前缀?
- asp.net-core - ASP.NET Core MVC:发布项目后,如何强制迁移更新到数据库?
- laravel - SSL Error in Laravel while calling external API
- javascript - 如何在jQuery中选择范围之间的元素
- java - finding object reference in array by index