ここからどこに行くのか把握しようとすると検索が疲れました。より良いオプション。UnicodeDecodeエラー:英語以外の文字に関連してxls(x)に書き込むときのデコード
概要:私はpythonを使用してウェブサイトの結果をスクラップし、そのデータをxls(x)ドキュメントに書き込みます。私はcsvが保存時に英語以外の文字を扱っていたので、xls(x)をcsvよりも選択しました。
英語のみのページでこのコードを正常に実行できましたが、英語以外の文字を入力するとすぐにwrite()に次のエラーがスローされます。
私もstring.decode('utf-8')
を試しましたが、 "ascii 'コーデックで文字をエンコードできません"というエラーが発生します。
質問:xls(x)への書き込みを正しく行うには、どうすればよいですか?私はCSVの問題なしにこれを行うことができましたが、私が言及したように、それを保存することで形式が変更されます。 write()関数が正しく転送するように、別の方法でエンコードする必要がありますか?
以下のコードでは、scrapy、コーデック、xlsxwriter(Workbook)などをインポートしました。
# set xpaths:
item_1 = 'xpath'
item_2 = 'xpath'
item_3 = 'xpath'
item_4 = 'xpath'
pagination_lookup = {}
results = []
def write_to_excel(list_of_dicts,filename):
filename = filename + '.xlsx'
ordered_list = list(set().union(*(d.keys() for d in list_of_dicts))) # OR set up as actual list of keys (e.g. ['Listing Title','Item Price', etc.])
wb=Workbook(filename)
ws=wb.add_worksheet("Sheet 1") #or leave it blank, default name is "Sheet 1"
first_row=0
for header in ordered_list:
col=ordered_list.index(header) # to keep order
ws.write(first_row,col,header) # to write first row/header
row=1
for each_dict in list_of_dicts:
for _key,_value in each_dict.items():
col=ordered_list.index(_key)
ws.write(row,col,_value)
row+=1 #enter the next row
wb.close()
name = 'Scraper'
# AREA FOR CODE TO GATHER AND SCRAPE URLS (taken out for brevity)
driver.get(clean_url)
time.sleep(2)
selectable_page = Selector(text=driver.page_source)
ResultsDict = {}
ResultsDict['item_1'] = selectable_page.xpath(item_1).extract_first().encode('utf-8')
ResultsDict['item_2'] = selectable_page.xpath(item_2).extract_first().encode('utf-8')
ResultsDict['item_3'] = selectable_page.xpath(item_3).extract_first().encode('utf-8')
ResultsDict['item_4'] = selectable_page.xpath(item_4).extract_first().encode('utf-8')
results.append(ResultsDict)
print ResultsDict
write_to_excel(results,'Scraped_results')
コードは英語以外の文字(例えばN、O、A、など)の任意の並べ替えを値によってトリガされ、このエラー、上で座礁
Traceback (most recent call last): File "/Users/name/scraper1/scraper1/spiders/scraped_results.py", line 128, in write_to_excel(results,'Scraped_results') [...] File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py", line 369, in write data, consumed = self.encode(object, self.errors) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 39: ordinal not in range(128)
は質問:これらのxls(x)への書き込みを正しく行うためには、どうすればよいですか?私はCSVの問題なしにこれを行うことができましたが、私が言及したように、それを保存することで形式が変更されます。 write()関数が正しく転送するように、別の方法でエンコードする必要がありますか?
あなたはトレースバックの最も重要な部分を省いています!あなたの*コード行でエラーが発生したのはどれですか? –
@MarkRansomが更新されました! – Winklevoss333