urllib2 / lxml编码问题

时间:2010-12-10 21:48:39

标签: python unicode encoding utf-8 lxml

我是python的新手,并尝试使用urllib2 / lxml来获取和解析页面。一切似乎都运行正常,除了解析的页面,在我的浏览器中打开时似乎嵌入了奇怪的字符。我猜这是一个unicode / lxml解析问题。当我获取元素的文本内容时,使用.text_content()并打印它,我得到的内容如下:“sometext \ 342 \ 200 \ 223 moretext”在原始页面中,显示为“sometext - moretext”

有谁能告诉我:
1.发生了什么事? 2.我该如何解决? 3.我在哪里可以阅读这些编码问题?

谢谢!

2 个答案:

答案 0 :(得分:2)

正在发生的事情是网站正在使用“endash”,这是一个稍长的破折号(你应该在范围内使用的那个,比如40-56,真的。是的,破折号本身就是一个完整的科学)。

在Unicode中,endash具有代码点U + 2013。您获得的数字\ 342 \ 200 \ 223是该代码点的UTF-8编码的八进制表示。为什么你得到八进制我不知道,我得到十六进制,所以在我的电脑上它看起来像'\ xe2 \ x80 \ x93'。但这没有任何区别,这只是代表。数字是一样的。

您可能应该尽可能早地解码您获得unicode的HTML字符串。你在获取页面时得到的标题应该告诉你它使用了什么编码(虽然这里显然是UTF8),从标题中提取数据相当容易,打印出标题时你会看到它。

然后解码html数据:

htmldata = htmldata.decode(<the encoding you found in the headers>)

答案 1 :(得分:0)

在这个过程的两个方面,你需要注意unicode问题:

  1. 将响应转换为unicode字符串nicely explained here on SO
  2. 输出字符串时指定合适的编码
  3. -

    #  from an lxml etree
    etree.tostring(root, encoding='utf-8', xml_declaration=False)
    
    # from a unicode string
    x.encode('utf-8')