Tôi gặp sự cố này khi cố gắng lấy tất cả các nút văn bản trong tài liệu HTML bằng lxml nhưng tôi nhận được UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)
. Tuy nhiên, khi tôi cố gắng tìm ra loại mã hóa của trang này (encoding = chardet.detect(response)['encoding']
), nó nói nó là utf-8
. Có vẻ lạ khi một trang đơn có utf-8 và ascii. Trên thực tế, điều này:UnicodeEncodeError khi tìm nạp url
fromstring(response).text_content().encode('ascii', 'replace')
giải quyết vấn đề.
Ở đây nó là mã của tôi:
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()
Output:
utf-8
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)
Tôi có thể làm gì để giải quyết vấn đề này ?. Hãy nhớ rằng tôi muốn làm điều này với một vài trang khác, vì vậy tôi không muốn mã hóa trên cơ sở cá nhân.
UPDATE:
Có thể có cái gì khác xảy ra ở đây. Khi tôi chạy kịch bản này trên thiết bị đầu cuối, tôi nhận được một đầu ra chính xác nhưng khi chạy nó bên trong SublimeText, tôi nhận được UnicodeEncodeError ... ¿?
UPDATE2:
Nó cũng đang xảy ra khi tôi tạo ra một tập tin với sản lượng này. .encode('ascii', 'replace')
đang hoạt động nhưng tôi muốn có giải pháp tổng quát hơn.
Trân
Có 'in u" \ u00A9 "' bên trong tập lệnh của bạn cũng tạo ra lỗi không? – jfs
Có.UnicodeEncodeError: 'ascii' codec không thể mã hóa ký tự u '\ xa9' ở vị trí 0: thứ tự không nằm trong phạm vi (128) :-) –
bạn có thể đặt PYTHONIOENCODING thành bất kỳ ký tự mã hóa nào SublimeText chấp nhận. – jfs