распечатать информацию в CSV-файле - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть программа, которая печатает информацию с веб-сайта, но я хочу поместить эту информацию в файл CSV или Excel.Это то, что я сделал:

import requests
from bs4 import BeautifulSoup
import re
import xlsxwriter


workbook  = xlsxwriter.Workbook('nossarede.xlsx')
worksheet = workbook.add_worksheet()

request = requests.get("http://www.drogariasnossarede.com.br/nossas-lojas")
soup = BeautifulSoup(request.content, 'html.parser')
data = soup.find_all("div", class_='item')

for container in data:
  Pharmacyname = container.find_all("h3")
  Pharmacyadd  = container.find_all("p")
  for pharmacy in Pharmacyname:
      print(pharmacy.text)
      for add in Pharmacyadd:
          print(add.text)
      print('')

До тех пор, пока все не будет идеально, оно печатается идеально так, как я хочу.Тогда я попробовал это:

    import csv
    with open('names.csv', 'wb') as ofile:
        writer = csv.writer(ofile)
        for container in data:
            Pharmacyname = container.find_all("h3")
            Pharmacyadd  = container.find_all("p")
            for pharmacy in Pharmacyname:
                for add in Pharmacyadd:
                    writer.writerow((pharmacy.text[0], add.text[1]))

Но это не работает.Это показывает это:

TypeError: a bytes-like object is required, not 'str'

Как я могу это сделать ??Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

изменить:

with open('names.csv', 'wb') as ofile:

в режиме записи байтов:

with open('names.csv', 'w') as ofile:

Полный код:

import requests
from bs4 import BeautifulSoup
import re
import xlsxwriter

request = requests.get("http://www.drogariasnossarede.com.br/nossas-lojas")
soup = BeautifulSoup(request.content, 'html.parser')
data = soup.find_all("div", class_='item')

import csv
with open('names.csv', 'w', newline='', encoding="utf-8") as ofile:
    writer = csv.writer(ofile)
    for container in data:
        Pharmacyname = container.find_all("h3")
        Pharmacyadd  = container.find_all("p")
        for pharmacy in Pharmacyname:
            for add in Pharmacyadd:
                writer.writerow((pharmacy.text, add.text))  
0 голосов
/ 21 февраля 2019

Вы открываете файл в байтовом режиме с помощью wb.

Просто измените это:

with open('names.csv', 'wb') as ofile:

для

with open('names.csv', 'w') as ofile:

Еще одна вещь.Ваш writerow не так.Вы получаете только первый символ строк.

Измените это:

 writer.writerow((pharmacy.text[0], add.text[0]))

для:

writer.writerow((pharmacy.text, add.text))
...