TypeError: objek byte-seperti diperlukan, bukan 'str' dalam python dan CSV

173

TypeError: diperlukan objek seperti byte, bukan 'str'

mendapatkan kesalahan di atas saat Menjalankan kode python di bawah ini untuk menyimpan data tabel HTML dalam file Csv. tidak tahu cara mendapatkan rideup. Tolong bantu saya.

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)

di atas baris terakhir.

ShivaGuntuku
sumber
halo - saya mencoba menjalankan ini pada ATOM saya di MX-Linux - tetapi saya mendapatkannya kembali: ´Traceback (panggilan terakhir terakhir): File "/home/martin/.atom/python/examples/bs_gumtree_pl.py", line 20, dalam <module> writer.writerows (list_of_rows) UnicodeEncodeError: codec 'ascii' tidak dapat menyandikan karakter u '\ xa0' di posisi 0: ordinal tidak dalam jangkauan (128) [Selesai dalam 2.015s] ´ yah saya bertanya-tanya apa berlangsung di sini!? senang mendengar dari Anda
nol

Jawaban:

332

Anda menggunakan metodologi Python 2 alih-alih Python 3.

Perubahan:

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

Untuk:

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

dan Anda akan mendapatkan file dengan output berikut:

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

Dalam Python 3 csv mengambil input dalam mode teks, sedangkan di Python 2 mengambilnya dalam mode biner.

Diedit untuk Tambah

Ini kode yang saya jalankan:

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
sumber
20
Untuk digunakan dengan csvmodul, Python 3 openseharusnya juga memiliki newline=''sebagai parameter [ref ]
Mark Tolonen
1
Ubah string 'wb' menjadi 'w' cocok untuk saya. Terima kasih banyak
Loc Huynh
Jika Anda menggunakan buffer, lihat jawaban vinyll !
Handras,
hai di sana - saya mencoba kode - dan kembali ini: `Traceback (panggilan terakhir terakhir): File" /home/martin/.atom/python/examples/bs_gumtree_pl.py ", baris 20, di <module> UnicodeEncodeError : 'ascii' codec tidak dapat menyandikan karakter u '\ xa0' di posisi 0: ordinal tidak dalam jangkauan (128) [Selesai dalam 1,415s] `saya tidak punya lem apa yang terjadi di sini
nol
21

Saya memiliki masalah yang sama dengan Python3. Kode saya sedang menulisio.BytesIO() .

Mengganti dengan io.StringIO()dipecahkan.

vinyll
sumber
terjadi pada saya dengan stringio juga
thebeancounter
Salah satu pertimbangan: io.StringIO()adalah keserakahan memori dan bisa menjadi sakit kepala dengan file besar.
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()

Dalam kasus saya, saya menggunakan BeautifulSoup untuk menulis .txt dengan Python 3.x. Itu memiliki masalah yang sama. Seperti yang dikatakan @tsduteba, ubah 'wb' di baris pertama menjadi 'w'.

Yang Li
sumber
Saat memberikan jawaban, lebih baik memberi penjelasan mengapa MENGAPA jawaban Anda adalah jawabannya . Dalam hal ini bagaimana perbedaan jawaban ini dari jawaban yang diterima?
Stephen Rauch
@StephenRauch Terima kasih atas komentar Anda. Saya baru di sini dan baru mulai belajar Python beberapa minggu yang lalu. Saya akan mencoba memberikan jawaban yang lebih baik di masa depan.
Yang Li
Anda dapat mengedit posting ini, dan menambahkan lebih detail. Tekan tombol edit di bawah dan di sebelah kiri pos.
Stephen Rauch
@StephenRauch Terima kasih atas tips Anda!
Yang Li
1

ubah saja wb ke w

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

untuk

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

Anda membuka file csv dalam mode biner, seharusnya '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
sumber