【问题标题】:How do you append rows to xlsx file when using beautifulsoup and pandas to scrape?使用beautifulsoup和pandas抓取时如何将行附加到xlsx文件?
【发布时间】:2020-06-21 23:46:30
【问题描述】:

So,我一直在寻找,我似乎无法弄清楚为什么我无法从我的抓取中获得结果以写入 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,但此时我很困惑,我不明白。

感谢所有帮助

【问题讨论】:

    标签: python-3.x pandas openpyxl pandas.excelwriter


    【解决方案1】:

    您正在逐行迭代您的 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()
    

    请注意,根据documentation'w'或Write是默认模式,修改对象时也是如此,虽然没有过多解释,但仅在添加全新的excel对象(Sheets等)时才会引用append,或者“extending”文档与另一个数据框的格式与文档结构完全相同。 为了使其可重现,您可以添加一个模板 xlsx,但我希望它有所帮助。请告诉我。

    【讨论】:

    • 感谢您的回复。它仍在向我抛出最后一个结果。我已更新问题以更好地反映正在发生的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2022-01-06
    • 2022-10-24
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多