TypeError: è richiesto un oggetto simile a byte, non 'str' in Python e CSV


173

TypeError: è richiesto un oggetto simile a byte, non 'str'

ottenere l'errore sopra durante l'esecuzione sotto il codice python per salvare i dati della tabella HTML nel file CSV. non so come ottenere rideup.pls aiutarmi.

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)

sopra l'ultima riga.



ciao - ho provato a eseguirlo sul mio ATOM su MX-Linux - ma torno indietro: ´Traceback (ultima chiamata più recente): File "/home/martin/.atom/python/examples/bs_gumtree_pl.py", linea 20, in <modulo> writer.writerows (list_of_rows) UnicodeEncodeError: il codec 'ascii' non può codificare il carattere u '\ xa0' in posizione 0: ordinale non nel range (128) [Terminato in 2.015s] ´ beh, mi chiedo cosa continua qui!? mi piace sentirti
zero il

Risposte:


332

Stai usando la metodologia Python 2 invece di Python 3.

Modificare:

outfile=open('./immates.csv','wb')

Per:

outfile=open('./immates.csv','w')

e otterrai un file con il seguente output:

SNo,States,Dist,Population
1,Andhra Pradesh,13,49378776
2,Arunachal Pradesh,16,1382611
3,Assam,27,31169272
4,Bihar,38,103804637
5,Chhattisgarh,19,25540196
6,Goa,2,1457723
7,Gujarat,26,60383628
.....

In Python 3 csv accetta l'input in modalità testo, mentre in Python 2 lo prende in modalità binaria.

Modificato per aggiungere

Ecco il codice che ho eseguito:

url='http://www.mapsofindia.com/districts-india/'
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html)
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','w')
writer=csv.writer(outfile)
writer.writerow(['SNo', 'States', 'Dist', 'Population'])
writer.writerows(list_of_rows)

20
Per l'uso con il csvmodulo, Python 3 opendovrebbe anche avere newline=''come parametro [ref ]
Mark Tolonen,

1
Cambia la stringa 'wb' in 'w' funziona per me. Grazie mille
Loc Huynh,

Se stai usando un buffer, vedi la risposta di vinyll !
handras

ciao lì - ho provato il codice - e ho ottenuto questo: `Traceback (ultima chiamata più recente): File" /home/martin/.atom/python/examples/bs_gumtree_pl.py ", linea 20, in <module> UnicodeEncodeError : il codec 'ascii' non può codificare il carattere u '\ xa0' in posizione 0: ordinale non nel range (128) [finito in 1.415s] `non ho colla cosa succede qui
zero

21

Ho avuto lo stesso problema con Python3. Il mio codice stava scrivendo in io.BytesIO().

Sostituzione con io.StringIO()risolto.


mi succede anche con stringio
thebeancounter il

Una considerazione: io.StringIO()è avidità di memoria e può essere un mal di testa con file di grandi dimensioni.
Flavio,

1
file = open('parsed_data.txt', 'w')
for link in soup.findAll('a', attrs={'href': re.compile("^http")}): print (link)
soup_link = str(link)
print (soup_link)
file.write(soup_link)
file.flush()
file.close()

Nel mio caso, ho usato BeautifulSoup per scrivere un .txt con Python 3.x. Aveva lo stesso problema. Proprio come ha detto @tsduteba, cambia 'wb' nella prima riga in 'w'.


Quando dai una risposta è preferibile dare una spiegazione del PERCHÉ la tua risposta è quella. In questo caso, in che modo questa risposta differisce dalla risposta accettata?
Stephen Rauch,

@StephenRauch Grazie per i tuoi commenti. Sono nuovo qui e ho appena iniziato a studiare Python diverse settimane fa. Proverò a dare una risposta migliore in futuro.
Yang Li,

Puoi modificare questo post e aggiungere ulteriori dettagli. Premi il pulsante Modifica in basso a sinistra del post.
Stephen Rauch,

@StephenRauch Grazie per i tuoi consigli!
Yang Li,

1

basta cambiare wb in w

outfile=open('./immates.csv','wb')

per

outfile=open('./immates.csv','w')

1

Stai aprendo il file CSV in modalità binaria, dovrebbe essere 'w'

import csv

# open csv file in write mode with utf-8 encoding
with open('output.csv','w',encoding='utf-8',newline='')as w:
    fieldnames = ["SNo", "States", "Dist", "Population"]
    writer = csv.DictWriter(w, fieldnames=fieldnames)
    # write list of dicts
    writer.writerows(list_of_dicts) #writerow(dict) if write one row at time
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.