2017-02-03 10 views
0

Я исчерпал свои поиски, пытаясь выяснить, куда идти отсюда, поэтому хотел бы посоветовать о возможных последующих шагах или даже лучший вариант.UnicodeDecode Error: декодирование при записи в xls (x), относящееся к неанглийским символам

Сводка: я использую python для очистки результатов от веб-сайтов, а затем для записи этих данных в документ xls (x). Я выбрал xls (x) через csv, потому что мой 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, 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() передает его правильно?

+0

Вы оставили самую важную часть трассы! Какая из * ваших * строк кода вызвала ошибку? –

+0

@MarkRansom обновлен! – Winklevoss333

ответ

1

Я предполагаю, что вы используете Python 2.x, который помогает вам делать decode для вас, когда вы передаете байтовую строку на что-то, что требует строки Unicode. К сожалению, это вряд ли когда-либо делает правильные вещи, поэтому они удалили эту способность в Python 3.

Вы создаете байтовые строки, используя .encode('utf-8') в своих скребках. Оставьте его и передайте строку Unicode в write_to_excel.