我是python的新手,并尝试使用urllib2 / lxml来获取和解析页面。一切似乎都运行正常,除了解析的页面,在我的浏览器中打开时似乎嵌入了奇怪的字符。我猜这是一个unicode / lxml解析问题。当我获取元素的文本内容时,使用.text_content()并打印它,我得到的内容如下:“sometext \ 342 \ 200 \ 223 moretext”在原始页面中,显示为“sometext - moretext”
有谁能告诉我:
1.发生了什么事?
2.我该如何解决?
3.我在哪里可以阅读这些编码问题?
谢谢!
答案 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问题:
-
# from an lxml etree
etree.tostring(root, encoding='utf-8', xml_declaration=False)
# from a unicode string
x.encode('utf-8')