UnicodeDecode错误:写入与非英语字符相关的xls(x)时的解码

问题描述 投票:0回答:2

我已经用尽了我的搜索,试图找出从这里开始的地方,所以会喜欢关于可能的后续步骤的建议,甚至是更好的选择。

概要:我使用python从网站上抓取结果,然后将该数据写入xls(x)doc。我在csv上选择了xls(x),因为我的csv在保存时不断修改非英文字符。

我已经设法在仅英文页面上成功运行此代码,但是一旦我点击非英文字符,它就会在write()上抛出以下错误。

要注意,我也尝试过string.decode('utf-8'),但是抛出一个“'ascii'编解码器无法编码字符”错误。

问题:为了正确地将这些写入xls(x),我需要做什么?我已经能够毫无问题地执行此操作,但正如我所提到的,保存它会破坏格式。我需要以不同的方式对其进行编码,以便write()函数正确地进行传输吗?

对于下面的代码,我已经导入了scrapy,编解码器,xlsxwriter(工作簿)和其他一些代码。

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

代码对此错误搁浅,该错误由具有任何非英语字符的值触发(例如ñ,ô,ä等)

回溯(最近一次调用最后一次):文件“/Users/name/scraper1/scraper1/spiders/scraped_results.py”,第128行,在write_to_excel中(结果,'Scraped_results')[...]文件“/ usr / local / Cellar / python / 2.7.11 / Frameworks / Python.framework / Versions / 2.7 / lib / python2.7 / codecs.py“,第369行,写入数据,消耗= self.encode(object,self.errors)UnicodeDecodeError: 'ascii'编解码器无法解码位置39的字节0xc3:序数不在范围内(128)

问题:为了正确地将这些写入xls(x),我需要做什么?我已经能够毫无问题地执行此操作,但正如我所提到的,保存它会破坏格式。我需要以不同的方式对其进行编码,以便write()函数正确地进行传输吗?

python excel scrapy xlsxwriter
2个回答
1
投票

我猜你正在使用Python 2.x,当你将字节字符串传递给需要Unicode字符串的东西时,它会帮助你做一个decode。不幸的是,它几乎没有做正确的事情,这就是为什么他们在Python 3中删除了这种能力。

您正在使用.encode('utf-8')创建字节字符串。保持关闭并将Unicode字符串传递给write_to_excel


0
投票

简单方案:

切换到python 3.6+

© www.soinside.com 2019 - 2024. All rights reserved.