Tôi cần tải xuống và phân tích trang web bằng lxml và tạo đầu ra xml UTF-8. Tôi nghĩ rằng giản đồ trong mã giả là minh họa hơn:Mã hóa bằng python với lxml - giải pháp phức tạp
from lxml import etree
webfile = urllib2.urlopen(url)
root = etree.parse(webfile.read(), parser=etree.HTMLParser(recover=True))
txt = my_process_text(etree.tostring(root.xpath('/html/body'), encoding=utf8))
output = etree.Element("out")
output.text = txt
outputfile.write(etree.tostring(output, encoding=utf8))
Vì vậy, tệp web có thể có bất kỳ mã hóa nào (lxml nên xử lý điều này). Outputfile phải nằm trong utf-8. Tôi không chắc chắn nơi để sử dụng mã hóa/mã hóa. Lược đồ này có được không? (Tôi không thể tìm thấy hướng dẫn tốt về lxml và mã hóa, nhưng tôi có thể tìm thấy nhiều vấn đề với điều này ...) Tôi cần giải pháp mạnh mẽ.
Edit:
Vì vậy, để gửi utf-8 để lxml tôi sử dụng
converted = UnicodeDammit(webfile, isHTML=True)
if not converted.unicode:
print "ERR. UnicodeDammit failed to detect encoding, tried [%s]", \
', '.join(converted.triedEncodings)
continue
webfile = converted.unicode.encode('utf-8')
Unicode Dường như có vẻ tốt. Và về etree bạn là đúng, tôi đã loại bỏ nó từ mã. –
Tại sao không truyền trực tiếp chuỗi đã giải mã (đối tượng unicode) sang html.fromstring(), thay vì mã hóa lại nó thành utf-8 ?? – lajarre
Tôi không thể nhớ được động lực cụ thể cách đây hai năm rưỡi, nhưng tôi nhớ rằng lxml không thích đầu vào Unicode trong một số trường hợp. Có một cơ hội rất tốt mà bất cứ vấn đề gì đã được sửa chữa, vì vậy có lẽ tốt hơn nên bỏ qua phần đó ngay bây giờ. libxml2 (mà quyền hạn lxml) không giống như đầu vào UTF-8, vì vậy nếu bạn có hiệu suất rất nhạy cảm, bạn có thể muốn tránh giải mã mã hóa nói riêng. –