При анализе некоторого HTML с использованием BeautifulSoup
или PyQuery
они будут использовать синтаксический анализатор, такой как lxml
или html5lib
. Допустим, у меня есть файл, содержащий следующее
<span> é and ’ </span>
В моей среде они кажутся неправильно закодированными, используя PyQuery
:
>>> doc = pq(filename=PATH, parser="xml")
>>> doc.text()
'é and â\u20ac\u2122'
>>> doc = pq(filename=PATH, parser="html")
>>> doc.text()
'Ã\x83© and ââ\x82¬â\x84¢'
>>> doc = pq(filename=PATH, parser="soup")
>>> doc.text()
'é and â\u20ac\u2122'
>>> doc = pq(filename=PATH, parser="html5")
>>> doc.text()
'é and â\u20ac\u2122'
Помимо того факта, что кодировка кажется неправильной, одна из основных проблем заключается в том, что doc.text()
возвращает экземпляр str
вместо bytes
, что не является нормой в соответствии с этим вопросом Я спросил вчера.
Кроме того, передача аргумента encoding='utf-8'
в PyQuery
кажется бесполезной, я пытался 'latin1'
ничего не изменить. Я также попытался добавить некоторые метаданные, потому что я прочитал, что lxml
прочитал их, чтобы выяснить, какую кодировку использовать, но это ничего не меняет:
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html;charset=latin1"/>
<span> é and ’ </span>
</head>
</html>
Если я использую lxml
напрямую, это кажется немного другим
>>> from lxml import etree
>>> tree = etree.parse(PATH)
>>> tree.docinfo.encoding
'UTF-8'
>>> result = etree.tostring(tree.getroot(), pretty_print=False)
>>> result
b'<span> é and ’ </span>'
>>> import html
>>> html.unescape(result.decode('utf-8'))
'<span> é and \u2019 </span>\n'
Erf, это меня немного сводит с ума, ваша помощь будет оценена