severum
Окт. 2, 2011 14:46:24
Подскажите пожалуйста, как получить читаемый результат в винде.
test.html в ANSI
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Привет</title>
</head>
<body>
hello
</body>
</html>
test.py в utf8
# -*- coding: UTF-8 -*-
import html5lib
import lxml.etree as etree
htmltext = open("test.html")
parser = html5lib.HTMLParser( tree=html5lib.getTreeBuilder("lxml") )
dom = parser.parse(htmltext)
find_a = etree.XPath("/html:html/html:head/html:title", namespaces={"html": "http://www.w3.org/1999/xhtml"})
nodes = find_a(dom)
print len(nodes)
for node in nodes:
print node
print type( node.text )
print node.text.encode('utf-8')
результат на экране:
1
<Element {http://www.w3.org/1999/xhtml}title at 0x28ff8c8>
<type 'unicode'>
├П├░├и├в├е├▓
pyuser
Окт. 3, 2011 05:15:17
Как-то сложно Вы делаете, попробуйте так:
with open("test.html", "rb") as f:
doc = html5lib.parse(f.read(),
treebuilder="lxml", namespaceHTMLElements=False)
for node in doc.iterfind("/head/title"):
print(node.text)
severum
Окт. 5, 2011 11:52:03
спасибо. так конечно короче. Надо будет почитать в чем отличия… такой путь “/head/title” в моем варианте не работал.
Но результат все-равно такой-же
File “test2.py”, line 19, in <module>
print(node.text)
File “C:\Python27\lib\encodings\cp866.py”, line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: ‘charmap’ codec can't encode characters in position 0-5: character maps to <undefined>
severum
Окт. 5, 2011 11:54:27
А нет никакой библиотеки пусть медленной, но чтобы работала как декодер лебедева, разве что без угадайки. т.е. задаешь байты + исходную кодировку и ту которую хочешь?