TypeError:PythonやCSVでは「str」ではなく、バイトのようなオブジェクトが必要です


173

TypeError: 'str'ではなく、バイトのようなオブジェクトが必要です

CsvファイルにHTMLテーブルデータを保存するpythonコードの下で実行中に上記のエラーを取得します。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)

最後の行の上に。



こんにちは-MX-Linux上の私のATOMでこれを実行しようとしました-しかし、私はこれを取得します:´Traceback(最後の最後の呼び出し):ファイル "/home/martin/.atom/python/examples/bs_gumtree_pl.py"、line 20、<module>でwriter.writerows(list_of_rows)UnicodeEncodeError: 'ascii' codec ca n't encode character u '\ xa0' in position 0:ordinal not range(128)[Finished in 2.015s] ´まあ何だろうここに行く!?あなたから話を聞くのが大好き
ゼロ

回答:


331

Python 3ではなくPython 2の方法論を使用しています。

変化する:

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

に:

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

次の出力を含むファイルが得られます。

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

Python 3ではcsvがテキストモードで入力を受け取りますが、Python 2ではバイナリモードで入力を受け取ります。

追加するために編集

ここに私が実行したコードがあります:

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
csvモジュールで使用するために、Python 3にopennewline=''パラメーターとして[ref ] も必要です
Mark Tolonen

1
'wb'文字列を 'w'に変更してください。本当にありがとう
Loc Huynh

バッファーを使用している場合は、Vinylの回答を参照してください。
handras

こんにちは-私はコードを試しました-そしてこれを取り戻しました: `トレースバック(最後の最新の呼び出し):ファイル" /home/martin/.atom/python/examples/bs_gumtree_pl.py "、line 20 in <module> UnicodeEncodeError :「ASCII」コーデックできないエンコードの文字のu「\ XA0」位置0で:序ない範囲(128)内には、[1.415sに仕上がり] `私はここに何が起こるのか全く糊がない
ゼロ

21

Python3でも同じ問題が発生しました。私のコードはに書き込んでいましたio.BytesIO()

io.StringIO()解決済みで置き換えます。


stringioでも私に起こります
thebeancounter

考慮事項の1つ io.StringIO()は、メモリの欲張りであり、大きなファイルで頭痛の種になる可能性があります。
フラビオ

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

私の場合、BeautifulSoupを使用してPython 3.xで.txtを記述しました。同じ問題がありました。@tsdutebaが言ったように、最初の行の「wb」を「w」に変更します。


答えを出すとき、なぜあなたの答えがそうであるのかについていくつかの説明を与えることが望ましいです。この場合、この回答は受け入れられた回答とどのように異なりますか?
スティーブンラウフ2017

@StephenRauchコメントありがとうございます。私はここに来たばかりで、数週間前にPythonの学習を始めたばかりです。将来はもっと良い答えを出そうと思います。
ヤン李

この投稿を編集して、詳細を追加できます。投稿の左下にある編集ボタンをクリックします。
Stephen Rauch 2017

@StephenRauchあなたのヒントをありがとう!
ヤン李


1

バイナリモードでcsvファイルを開いています。 '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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.