2010-09-23 66 views
0

我试图解析编码为utf-8的文件。除了写入文件之外,没有任何操作存在问题(或者至少我认为是这样)。最小工作示例如下:违反字符编码

from lxml import etree 
parser = etree.HTMLParser() 
tree = etree.parse('example.txt', parser) 
tree.write('aaaaaaaaaaaaaaaaa.html') 

将example.txt:

<html> 
    <body> 
     <invalid html here/> 
     <interesting attrib1="yes"> 
      <group> 
       <line> 
        δεδομένα1 
       </line> 
      </group> 
      <group> 
       <line> 
        δεδομένα2 
       </line> 
      </group> 
      <group> 
       <line> 
        δεδομένα3 
       </line> 
      </group> 
     </interesting> 
    </body> 
</html> 

我已经知道一个similar previous question,但要么不指定输出编码,或使用utf8iso-8859-7我没能解决问题。

我得出结论,该文件在utf8,因为它在选择此编码时在Chrome上正确显示。我的编辑(凯特)对此表示赞同。

我没有运行时错误,但输出不符合要求。 实施例输出与tree.write('aaaaaaaaaaaaaaaaa.html', encoding='utf-8')

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body> 
     <invalid html="" here=""/><interesting attrib1="yes"><group><line> 
        δεδομένα1 
       </line></group><group><line> 
        δεδομένα2 
       </line></group><group><line> 
        δεδομένα3 
       </line></group></interesting></body></html> 
+0

你得到了什么错误,你怎么得到它?请张贴破解的代码和错误信息。你链接的问题告诉你,'lxml'以ASCII形式写入所有内容,除非你不告诉它;你尝试过'tree.write(,encoding =“utf-8”)吗? – katrielalex 2010-09-23 17:44:08

+0

我编辑了这个问题。我没有运行时错误。不幸的是,你可以看到输出没有被正确编码。 – 2010-09-23 17:58:01

+0

我不知道这个库,但也许你必须指定输入编码(它可能默认为ASCII,或者你的本地默认编码)。为什么,顺便说一句,你是否在这个例子中使用了一个无效的HTML文档? – 2010-09-23 18:05:24

回答

1

的明显的问题是的HTMLParser对待输入文件作为ANSI默认,即UTF-8字节被误解为8位字符代码。你可以简单地通过编码来解决这个问题:

parser = etree.HTMLParser(encoding = "utf-8") 

如果你想检查我的意思与误解,让蟒纹repr(tree.xpath("//line")[0].text)有和无的HTMLParser的encoding参数。