Как вы добавляете строки в файл xlsx при использовании Beautifulsoup и pandas для очистки? - PullRequest
0 голосов
/ 10 марта 2020

enter image description here Итак, я искал повсюду и не могу понять, почему я не могу получить результаты из моей работы для записи в файл xlsx.

Я запускаю список URL-адресов из файла .csv. Я добавляю туда 10 URL, 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, но в этот момент я так растерялся, что не понимаю этого.

Любая помощь приветствуется

1 Ответ

1 голос
/ 10 марта 2020

Вы перебираете свои данные CSV построчно, но вы воссоздаете свой фрейм данных на каждой итерации, поэтому вы теряете значение предыдущего каждый раз. Сначала вам нужно будет создать df за пределами l oop и добавить в него данные для l oop.

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 (Sheets, et c.) или « расширение » документа с другим фреймом данных в том же формате, что и в структуре документа. Чтобы он был воспроизводимым, вы можете добавить шаблон xlsx, но я надеюсь, что это поможет. Пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...