TypeError: se requiere un objeto similar a bytes, no 'str' en python y CSV

173

TypeError: se requiere un objeto similar a bytes, no 'str'

obtener el error anterior mientras se ejecuta el código python debajo para guardar los datos de la tabla HTML en el archivo Csv. no sé cómo obtener rideup.pls ayúdame.

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)

encima de la última línea.

ShivaGuntuku
fuente
hola, intenté ejecutar esto en mi ATOM en MX-Linux, pero recuperé esto: ´Traceback (última llamada más reciente): Archivo "/home/martin/.atom/python/examples/bs_gumtree_pl.py", línea 20, en <module> writer.writerows (list_of_rows) UnicodeEncodeError: el códec 'ascii' no puede codificar el carácter u '\ xa0' en la posición 0: ordinal no en el rango (128) [Finalizado en 2.015s] ´ bueno, me pregunto qué continúa aquí? encanta saber de usted
cero

Respuestas:

332

Está utilizando la metodología Python 2 en lugar de Python 3.

Cambio:

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

A:

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

y obtendrá un archivo con el siguiente resultado:

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
.....

En Python 3, csv toma la entrada en modo texto, mientras que en Python 2 la toma en modo binario.

Editado para agregar

Aquí está el código que ejecuté:

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)
dstudeba
fuente
20
Para usar con el csvmódulo, Python 3 opentambién debe tener newline=''como parámetro [ref ]
Mark Tolonen
1
Cambiar la cadena 'wb' a 'w' me funciona. Muchas gracias
Loc Huynh
Si está utilizando un búfer, ¡vea la respuesta de vinyll !
handras
hola, probé el código y recuperé esto: `Traceback (última llamada más reciente): Archivo" /home/martin/.atom/python/examples/bs_gumtree_pl.py ", línea 20, en <module> UnicodeEncodeError : el códec 'ascii' no puede codificar el carácter u '\ xa0' en la posición 0: ordinal no en el rango (128) [Terminado en 1.415s] `no tengo pegamento lo que sucede aquí
cero
21

Tuve el mismo problema con Python3. Mi código estaba escribiendo io.BytesIO().

Sustitución por io.StringIO()resuelto.

vinil
fuente
me pasa con stringio también
thebeancounter
Una consideración: io.StringIO()es la codicia de la memoria y puede ser un dolor de cabeza con archivos grandes.
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()

En mi caso, utilicé BeautifulSoup para escribir un archivo .txt con Python 3.x. Tuvo el mismo problema. Tal como dijo @tsduteba, cambie el 'wb' en la primera línea a 'w'.

Yang Li
fuente
Al dar una respuesta, es preferible dar una explicación de POR QUÉ su respuesta es la correcta. En este caso, ¿cómo difiere esta respuesta de la respuesta aceptada?
Stephen Rauch
@StephenRauch Gracias por sus comentarios. Soy nuevo aquí y acabo de comenzar a aprender Python hace varias semanas. Intentaré dar una mejor respuesta en el futuro.
Yang Li
Puede editar esta publicación y agregar más detalles. Presiona el botón de edición debajo y a la izquierda de la publicación.
Stephen Rauch
@StephenRauch ¡Gracias por tus consejos!
Yang Li
1

solo cambia wb a w

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

a

outfile=open('./immates.csv','w')
Sarath Ak
fuente
1

Está abriendo el archivo csv en modo binario, debería ser '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
Sohan Das
fuente