TypeError: wymagany jest obiekt podobny do bajtów, a nie „str”
uzyskiwanie powyższego błędu podczas wykonywania poniższego kodu Pythona w celu zapisania danych tabeli HTML w pliku CSV. nie wiem jak uzyskać pomoc rideup.pls.
import csv
import requests
from bs4 import BeautifulSoup
url='http://www.mapsofindia.com/districts-india/'
response=requests.get(url)
html=response.content
soup=BeautifulSoup(html,'html.parser')
table=soup.find('table', attrs={'class':'tableizer-table'})
list_of_rows=[]
for row in table.findAll('tr')[1:]:
list_of_cells=[]
for cell in row.findAll('td'):
list_of_cells.append(cell.text)
list_of_rows.append(list_of_cells)
outfile=open('./immates.csv','wb')
writer=csv.writer(outfile)
writer.writerow(["SNo", "States", "Dist", "Population"])
writer.writerows(list_of_rows)
nad ostatnią linią.
csv
python-3.x
beautifulsoup
html-table
ShivaGuntuku
źródło
źródło
Odpowiedzi:
Używasz metodologii Python 2 zamiast Python 3.
Zmiana:
Do:
a otrzymasz plik z następującym wyjściem:
W Pythonie 3 csv pobiera dane wejściowe w trybie tekstowym, podczas gdy w Pythonie 2 pobiera je w trybie binarnym.
Edytowano do dodania
Oto kod, który uruchomiłem:
źródło
csv
modułem, Python 3open
powinien mieć równieżnewline=''
jako parametr [ref ]Miałem ten sam problem z Pythonem3. Mój kod był w trakcie pisania
io.BytesIO()
.Zastąpienie
io.StringIO()
rozwiązanym.źródło
io.StringIO()
to chciwość pamięci i może być bólem głowy przy dużych plikach.W moim przypadku użyłem BeautifulSoup do napisania .txt w Pythonie 3.x. Miał ten sam problem. Tak jak powiedział @tsduteba, zmień „wb” w pierwszym wierszu na „w”.
źródło
po prostu zmień wb na w
do
źródło
Otwierasz plik csv w trybie binarnym, powinno być
'w'
źródło