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.



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)

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.


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


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')

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.