【问题标题】:Python: Export the tabulate output data into csv filePython:将表格输出数据导出到 csv 文件中
【发布时间】:2018-10-09 09:18:14
【问题描述】:

我想将 HTML 表格数据存储到 CSV 文件中。

我使用 python、selenium、BeautifulSoup、pandas、tabulate、numpy 编写了以下代码。

from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
from tabulate import tabulate
import numpy as np     
#---Some code are here
datalist2 = []
for i in range(1, total+1):
    xpath="/html/body/div[3]/table/tbody/tr/td[2]/div[2]/table/tbody/tr["+str(i)+"]/td[1]/a/img"
    driver.find_element_by_xpath(xpath).click()
    print("Open button " + str(i) + " Clicked")
    soup_level2=BeautifulSoup(driver.page_source, 'lxml')
    table2=soup_level2.find_all('table')[0]
    df2=pd.read_html(str(table2),header=0)
    datalist2.append(df2[0])
    driver.execute_script("window.history.go(-1)")
    print("moving_back_to_previous_page")   
for i in range(len(datalist2)):
        print(tabulate(datalist2[i]))
#text_file=open("output.csv","w")
#text_file.write(str(datalist2))
#text_file.close()  
#print("report generated and saved")
#np.savetxt("output.csv", datalist2, delimiter=",", fmt='%s')

此代码print(tabulate(datalist2[i])) 在控制台中显示表格数据。

print(tabulate(datalist2[i])) 的示例输出

 0  Date Crashed    nan  2018-10-09 07:56:49 UTC
 1  Date Reported   nan  2018-10-09 07:56:57 UTC
 2  Date Built      nan  2018-06-06 01:26:35 UTC
 3  Crash Reason    nan  SIGSEGV
 4  Crash Addr      nan  0x0
 5  Dump file name  nan  9556393da77a562fa086b0147a37106c6ff4bb76_mac14B7F66_dat2018-10-09-07-56-49_boxXB6_modC40COM_54dc2dd1-9abe-a568-1e3119e4-1908ccb0.dmp.tgz

此代码text_file.write(str(datalist2)) 将 datalist2 存储到 CSV 文件中。这段代码有问题。它不显示长文本。例如,索引 5 无法完整显示转储文件名。 text_file.write(str(datalist2))的示例输出

0     Date Crashed         NaN                            2018-10-09 07:56:49 UTC
1    Date Reported         NaN                            2018-10-09 07:56:57 UTC
2       Date Built         NaN                            2018-06-06 01:26:35 UTC
3     Crash Reason         NaN                                            SIGSEGV
4       Crash Addr         NaN                                                0x0
5   Dump file name         NaN  9556393da77a562fa086b0147a37106c6ff4bb76_mac14...

我还想删除索引列,第二列包含“nan”作为值。 我想将此数据存储到 CSV 文件中。 我该怎么做?

【问题讨论】:

    标签: python pandas selenium numpy beautifulsoup


    【解决方案1】:

    删除索引列和包含空值的第二列显示为'NaN'

    soup_level2=BeautifulSoup(driver.page_source, 'lxml')
    table2=soup_level2.find_all('table')[0]
    table_body = table2.find_all('tbody')[0]
    rows = table_body.find_all('tr')
    for row in rows:
        cols = row.find_all('td')
        cols = [ele.text.strip() for ele in cols]
        datalist2.append([ele for ele in cols if ele]) # Get rid of empty values
    

    以下代码将表格输出数据导出到 csv 文件中

    content2=tabulate(datalist2, tablefmt="tsv")
    text_file=open("output.csv","w")
    text_file.write(content2)
    text_file.close()
    

    现在,它还显示长文本。

    以下代码使用 'numpy' 将 datalist2 导出为 CSV

    np.savetxt("output_np.csv", datalist2, delimiter=",", fmt='%s'    
    

    以下代码使用“pandas”将 datalist2 导出为 CSV

    my_df=pd.DataFrame(datalist2)
    my_df.to_csv('output.csv', index=False, header=False)
    

    【讨论】:

    • 为什么这个答案被否决了?预期的解释。
    【解决方案2】:

    这是因为 pandas 的默认列宽为 50。您可以简单地将其设置为您期望的最大长度,或者将其设置为 -1 以禁用列最大宽度。

    在编写之前添加以下行:

    pd.set_option('display.max_colwidth', -1)
    

    详情见链接: https://pandas.pydata.org/pandas-docs/stable/options.html

    【讨论】:

    • 我不接受这个解决方案,因为这个解决方案没有显示如何将表格输出数据导出到 csv 文件中。它没有显示如何删除“NaN”和索引列。
    • 那 nan 的东西是在编辑之后出现的吗?记住规则 - 对不同的问题使用不同的问题。
    • NaN 来自没有任何值的列。表包含 3 列。第二列没有值。代替空白区域,显示 NaN。
    • @DipankarNalui 请阅读有关提问的 SO 指南。您在一个问题中提出了两个问题(处理 NaN 和截断长值)——这两个问题都是现有问题的重复。您问题的第一部分询问“此代码有问题。它没有显示长文本。”我就是这么回答的。请遵守指南。
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多