【问题标题】:How to create a data frame from each url and then merge them?如何从每个 url 创建一个数据框然后合并它们?
【发布时间】:2019-09-22 13:11:24
【问题描述】:

我正在尝试设置我的代码以从列表中的每个 url 创建一个数据帧,然后将这些数据帧组合成一个数据帧。

我非常接近完成;但是,就像现在一样,我的代码显示此错误消息cannot concatenate object of type "<class 'list'>"; only pd.Series, pd.DataFrame, and pd.Panel (deprecated) objs are valid

urls = ['url1', 'url2']
appended_data = []
for url in urls:
    driver = webdriver.Chrome(r'C:\Users\bobby\OneDrive\Documents\MyPrograms\webdrivers\chromedriver.exe')
    driver.implicitly_wait(30)
    driver.get(url)

    tables = pd.read_html(driver.page_source)
    df = tables
    appended_data.append(df)
    driver.close()

appended_data = pd.concat(appended_data)
appended_data.to_csv(r'C:\Users\bobby\OneDrive\Documents\RecruitingApp\hopefullyit\test.csv')

我需要帮助获取代码以从每个 url 创建一个 df,然后将它们组合并写入 csv。

这是完整的错误信息

--------------------------------------------------------------------------- 
 TypeError                                 Traceback (most recent call last) 
<ipython-input-2-7451d5b1833d> in <module>
     11     driver.close()
      12 
 ---> 13 appended_data = pd.concat(appended_data)
     14 appended_data.to_csv(r'C:\Users\bobby\OneDrive\Documents\RecruitingApp\hopefullyit\test.csv')

~\Anaconda3\lib\site-packages\pandas\core\reshape\concat.py in concat(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, sort, copy)
    226                        keys=keys, levels=levels, names=names,
    227                        verify_integrity=verify_integrity,
--> 228                        copy=copy, sort=sort)
    229     return op.get_result()
    230 

~\Anaconda3\lib\site-packages\pandas\core\reshape\concat.py in __init__(self, objs, axis, join, join_axes, keys, levels, names, ignore_index, verify_integrity, copy, sort)
    287                        ' only pd.Series, pd.DataFrame, and pd.Panel'
    288                        ' (deprecated) objs are valid'.format(type(obj)))
--> 289                 raise TypeError(msg)
     290 
    291             # consolidate

TypeError: cannot concatenate object of type "<class 'list'>"; only 
pd.Series, pd.DataFrame, and pd.Panel (deprecated) objs are valid

【问题讨论】:

  • 分别写出来。
  • 您确定该网址有数据吗?问题是它没有找到数据。看看它告诉你它就像一个HTML标签&lt;class 'list'&gt;
  • 哪一行有问题?始终将完整的错误消息(完整的 Traceback)放在问题中(作为文本,而不是屏幕截图)。还有其他有用的信息。
  • 您可以保留所有列表并在最后转换为数据框 - DataFrame(list) - 无需连接。或者您必须在连接到 DataFrame 之前将新列表转换为 DataFrame - DataFrame(new_data)
  • 如您在错误消息中看到的 - 您必须将 list 转换为 dataFrame 才能连接它。 read_htmt 提供 HTML 中所有表格的列表,并将其附加到列表 appended_data 中,这样您就有了二维列表。你可以使用print(appended_data)查看。

标签: python pandas dataframe url web-scraping


【解决方案1】:

正如@furas 和我所说,pandas read_html 从 URL 源检索数据帧列表。所以你只需要询问列表的适当索引。如果你只检索一张表,你可以要求索引。

 df = tables[0]
 appended_data.append(df)
 driver.close()

【讨论】:

  • 对不起,我的速度很慢,但我没有关注。我曾尝试过在 [0] 处索引列表,它只将我的一个 url 数据打印或写入 .csv 文件。但我想做的是将我从 url 获得的所有数据写入单个 .csv。
  • 好的。现在我明白了。好吧,如果你在 dataFrames 列表中有多个表,你可以创建一个循环,然后尝试追加到一个新的 DataFrame。您的名单上不止一张桌子吗?
  • 记住。你有一个太多的 URL,我们说每个 URL 只有一个表。如果是这样,那很好,但是如果您有不止一张桌子,或者有时您有不止一张桌子。你最好为这种情况创建一个循环。尝试分析它,然后再回来。这对我们来说会更容易。
  • 好的,谢谢,这很有帮助。但是是的,列表中不止一个表,每个 URL 有一个表。每次代码运行时,它都会从其各自的 URL 获取表,然后将其附加到列表 appended_data。当我只尝试在循环之后打印appended_data 时,这正是我想要的。当我尝试使用to.csv 时,就会出现问题,因为它是一个列表而不是数据框。我不清楚的是在不丢失格式的情况下将该信息写入 .csv 的最佳方法是什么?
猜你喜欢
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多