我有這個問題試圖使用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。其實這個:獲取url時出現UnicodeEncodeError
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)
我能做些什麼來解決這個問題?請記住,我想用其他幾頁來做這件事,所以我不想單獨編碼。
UPDATE:
也許還有別的東西怎麼回事。當我在終端上運行這個腳本時,我得到了正確的輸出,但是當它在SublimeText中運行時,我得到了UnicodeEncodeError ...¿?
UPDATE2:
當我創建這個輸出文件,它也發生了。 .encode('ascii', 'replace')
正在工作,但我想有一個更一般的解決方案。
問候
在腳本內部是否有'print u「\ u00A9」'也會產生錯誤? – jfs
是的。UnicodeEncodeError:'ascii'編解碼器無法對位置0中的字符u'\ xa9'進行編碼:序號不在範圍(128)中:-) –
您可以將PYTHONIOENCODING設置爲任何編碼SublimeText所接受的字符。 – jfs