Python +熊猫;如何正确合并数据帧列表的字典,并将其保存到xlsx或csv作为单个表.<



我要抓取一个数据库,它以最不友好的方式放在一个公共网站上——作为一个有数千页的表。每个页面结构是相同的,url只是页码不同。

我尝试了bf4和pandas的几个选项,最终得到以下代码:

import pandas as pd
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
hdr = {'User-Agent': 'Chrome/70.0.3538.110'}
table_dfs = {}
for page_number in range(5):
http = "https://www._SomeLongURL_&page={}".format(page_number + 1)
table_dfs[page_number] = pd.read_html(http)
print(table_dfs)

这段代码成功创建了dataframe列表的字典。以5项为例。Print将每个页面中的table作为dict元素,因此代码似乎可以按预期工作。我还计划实现sleep元素以降低服务器负载,当我将使用完整的1k页面时。

但现在我面临两个问题:

  1. 给出每个表的缩略版本。网站上的每个表有200行,但代码输出只显示每个表的第一行和最后5行。也许经过适当的合并保存到一个文件,它将有所有的行?
  2. 最终我需要得到一个巨大的表,它结合了所有较小的表,将其保存到一个文件(xlsx, csv等)进行进一步处理。我试过合并,连接,转换一些东西,但真的很幸运,因为我是Python的新手。

请帮我完成这个代码。如何将所有内容合并到一个大表中?

更新1。为了附加所有单独的dataframe,我尝试提取每个dataframe,然后进行迭代,但是print只给出一个DF:

final_df = table_dfs[0].__getitem__(0)
for page_number in range(1, 5):
temp_df = table_dfs[page_number].__getitem__(0)
final_df.append(temp_df, ignore_index=True)
print(final_df)

我想我们接近解决了,但是我在某个地方犯了一个错误。请看一下上面的代码部分。

更新2。解决了

而不是追加,我试图使用pd.concat,它的工作。这是我最后的代码:

import pandas as pd
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
hdr = {'User-Agent': 'Chrome/70.0.3538.110'}
table_dfs = {}
for page_number in range(5):
http = "https://www._SomeLongURL_&page={}".format(page_number + 1)
table_dfs[page_number] = pd.read_html(http)
#pd.set_option('display.max_rows', None)
final_df = table_dfs[0].__getitem__(0)
for page_number in range(1, 5):
temp_df = table_dfs[page_number].__getitem__(0)
final_df = pd.concat([final_df, temp_df])
print(final_df)
final_df.to_excel("All_pages.xlsx")
  1. pandas默认只打印部分数据帧。在打印数据帧之前尝试设置pd.set_option('display.max_rows', None)
  2. 尝试遍历列表的每个df并附加
final_df = table_dfs[0]
for page_number in range(1,5):
final_df.append(table_dfs[page_number], ignore_index=True)

最新更新