9

我在尝试使用 lxml 获取 HTML 文档中的所有文本节点时遇到了这个问题,但我得到了 UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)。但是,当我尝试找出此页面的编码类型 ( encoding = chardet.detect(response)['encoding']) 时,它说它是utf-8. 一个页面有 utf-8 和 ascii 似乎很奇怪。其实这个:

fromstring(response).text_content().encode('ascii', 'replace')

解决问题。

这是我的代码:

from lxml.html import fromstring
import urllib2
import chardet
request = urllib2.Request(my_url)
request.add_header('User-Agent',
                   'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)')   
request.add_header("Accept-Language", "en-us")
response = urllib2.urlopen(request).read()

print encoding
print fromstring(response).text_content()

输出:

utf-8
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)

我能做些什么来解决这个问题?请记住,我想对其他几个页面执行此操作,因此我不想单独编码。

更新:

也许这里还有其他事情发生。当我在终端上运行这个脚本时,我得到了正确的输出,但是当在 SublimeText 中运行它时,我得到 UnicodeEncodeError...¿?

更新2:

当我使用此输出创建文件时也会发生这种情况。.encode('ascii', 'replace')正在工作,但我想要一个更通用的解决方案。

问候

4

3 回答 3

5

你可以尝试用 repr() 包装你的字符串吗? 这篇文章可能会有所帮助。

print repr(fromstring(response).text_content())
于 2012-06-22T02:49:27.897 回答
3

就您在编辑中所说的写出文件而言,我建议使用编解码器模块打开文件:

import codecs
output_file = codecs.open('filename.txt','w','utf8')

我不知道 SublimeText,但它似乎试图将您的输出读取为 ASCII,因此出现编码错误。

于 2012-06-22T03:23:19.897 回答
0

根据您的第一次更新,我会说终端告诉 Python 输出 utf-8 并且 SublimeText 明确表示它需要 ascii。所以我认为解决方案是在 SublimeText 中找到正确的设置。

但是,如果您无法更改 SublimeText 的期望,最encode好像在单独的函数中那样使用该函数。

def smartprint( text ) :
    if sys.stdout.encoding == None :
        print text
    else :
        print text.encode( sys.stdout.encoding , 'replace' )

您可以使用此功能代替print. 请记住,在 SublimeText 中运行时程序的输出与终端不同。因为replace当这段代码在 SublimeText 中运行时,重音字符会失去重音,例如é将显示为e.

于 2012-06-21T20:51:22.450 回答