我正试图解析一个网站的源代码,以便使用lxml库提取内部文本。这是我的密码
import urllib2
from StringIO import StringIO
from lxml import html
from lxml.html.clean import Cleaner
cleaner = Cleaner(page_structure = False)
htmlsource = cleaner.clean_html(urllib2.urlopen("http://www.verycd.com/").read())
htmltree = html.parse(StringIO(htmlsource.decode("utf-8"))).getroot()
listnode = htmltree.xpath("*")
for node in listnode:
print node.text_content().strip().encode("utf-8")当我在交互式控制台中运行代码时,结果如下(dev环境)
VeryCD电驴大全 - 分享互联网
用户名:
密码:记住我
免费注册
|
忘记密码?
首页 |
商城 |
专题 |
乐园 |
社区 |
电驴 |
网页游戏 |
网址大全但是在生产环境中,所有unicode字符都显示不正确。
VeryCDçµé©´å¤§å¨ - å享äºèç½
ç¨æ·åï¼
å¯ç ï¼è®°ä½æÂ
Â
å费注å
|
å¿è®°å¯ç ï¼
é¦é¡µ |
åå |
ä¸é¢ |
ä¹å |
ç¤¾åº |
çµé©´ |
ç½é¡µæ¸¸æ |
ç½å大å¨知道我该怎么解决这个问题吗?
编辑
好像我在这里发现了问题。我认为lxml内置的GAE有问题。如果我在解析html之前不使用更干净的语言,那么输出是可以的。
# cleaner = Cleaner(page_structure = False)
# htmlsource = cleaner.clean_html(urllib2.urlopen("http://www.verycd.com/").read())
htmlsource = urllib2.urlopen("http://www.verycd.com/").read()
htmltree = html.parse(StringIO(htmlsource.decode("utf-8"))).getroot()发布于 2012-05-17 06:05:21
更新:这个bug在App中是固定的,所以下面的工作应该不再是必要的了。
在lxml或App中,我都接受了这个错误。但是您可以使用lxml.etree.parse和lxml.etree.HTMLParser来解决这个问题(请注意,lxml.html是这两个方面的简单包装器):
import urllib2
from StringIO import StringIO
from lxml import etree
from lxml.html.clean import Cleaner
cleaner = Cleaner(page_structure = False)
htmlsource = cleaner.clean_html(urllib2.urlopen("http://www.verycd.com/").read())
htmlparser = etree.HTMLParser(encoding='utf-8')
htmltree = etree.parse(StringIO(htmlsource.decode("utf-8")),
parser=htmlparser).getroot()
listnode = htmltree.xpath("*")
for node in listnode:
print node.text.strip().encode("utf-8")这就是:
encoding='utf-8'.
etree.parse而不是html.parse;将parser=htmlparser传递给etree.parse.
node.text而不是node.text_content().通过显式地告诉HTMLParser使用UTF-8编码,而不是让它猜测(它不正确地猜测拉丁语-1),这就解决了错误。
发布于 2012-05-15 23:29:48
以下是处理案文的最基本规则:
在打印语句中添加编码,您应该会没事的。
https://stackoverflow.com/questions/10603378
复制相似问题