Я пытаюсь использовать модуль lxml для разбора файлов HTML, но пытаюсь заставить его работать с некоторыми данными в кодировке UTF-8.Я использую Python 2.7 на Windows.Например, рассмотрим файл в кодировке UTF-8 без метки порядка байтов, который содержит только текстовую строку Québec
.Если я просто читаю содержимое файла с помощью обычного файлового обработчика и декодирую полученный строковый объект, я получаю строку Unicode длиной 6, которая выглядит хорошо при записи обратно в файл.Но если я проанализирую файл с помощью lxml, я получу строку длиной 7 юникод, которая выглядит странной, когда записывается обратно в файл.Может кто-нибудь объяснить, что происходит по-разному с lxml и как получить оригинальную красивую строку?
Например:
import lxml.html as html
from lxml import etree
f = open("output.txt", "w")
text = open("input.txt").read().decode("utf-8")
f.write("String of type '%s' with length %d: %s\n" % (type(text), len(text), text.encode("utf-8")))
root = html.parse("input.txt")
text = root.xpath(".//p")[0].text.strip()
f.write("String of type '%s' with length %d: %s\n" % (type(text), len(text), text.encode("utf-8")))
Производит вывод в output.txt
из:
String of type '<type 'unicode'>' with length 6: Québec
String of type '<type 'unicode'>' with length 7: Québec
РЕДАКТИРОВАТЬ
ЧастичноеОбходной путь здесь, кажется, состоит в том, чтобы проанализировать файл, используя:
etree.parse("input.txt", etree.HTMLParser(encoding="utf-8"))
или
html.parse("input.txt", etree.HTMLParser(encoding="utf-8"))
Однако, насколько я знаю, в библиотеке базовых этри отсутствуют некоторые удобные классы для таких вещей, как селекторы,поэтому решение, позволяющее мне использовать lxml.html без etree.HTMLParser (), все равно будет полезным.