首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在中解析html时出现Unicode问题

在中解析html时出现Unicode问题
EN

Stack Overflow用户
提问于 2012-05-15 14:52:50
回答 2查看 489关注 0票数 1

我正试图解析一个网站的源代码,以便使用lxml库提取内部文本。这是我的密码

代码语言:javascript
复制
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环境)

代码语言:javascript
复制
VeryCD电驴大全 - 分享互联网
用户名:
        密码:记住我 


        免费注册
         |
        忘记密码?



            首页 |
            商城 |
            专题 |
            乐园 |

            社区 |
            电驴 |
            网页游戏 |
            网址大全

但是在生产环境中,所有unicode字符都显示不正确。

代码语言:javascript
复制
VeryCDçµé©´å¤§å¨ - å享äºèç½
ç¨æ·åï¼
        å¯ç ï¼è®°ä½æÂ 

        Â 
        å费注å
         |
        å¿è®°å¯ç ï¼



            é¦é¡µ |
            åå |
            ä¸é¢ |
            ä¹å |

            ç¤¾åº |
            çµé©´ |
            ç½é¡µæ¸¸æ |
            ç½å大å¨

知道我该怎么解决这个问题吗?

编辑

好像我在这里发现了问题。我认为lxml内置的GAE有问题。如果我在解析html之前不使用更干净的语言,那么输出是可以的。

代码语言:javascript
复制
# 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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-17 06:05:21

更新:这个bug在App中是固定的,所以下面的工作应该不再是必要的了。

在lxml或App中,我都接受了这个错误。但是您可以使用lxml.etree.parselxml.etree.HTMLParser来解决这个问题(请注意,lxml.html是这两个方面的简单包装器):

代码语言:javascript
复制
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'.

  • Use

  • 创建HTMLParser对象,显式设置HTMLParser etree.parse而不是html.parse;将parser=htmlparser传递给etree.parse.

  • Use node.text而不是node.text_content().

通过显式地告诉HTMLParser使用UTF-8编码,而不是让它猜测(它不正确地猜测拉丁语-1),这就解决了错误。

票数 0
EN

Stack Overflow用户

发布于 2012-05-15 23:29:48

以下是处理案文的最基本规则:

  1. 将文本解码为unicode,一旦您读取它(您正在这样做),
  2. 就会用unicode完成您的所有处理(您正在这样做),
  3. 会在输出之前对文本进行编码。你不能这样做。

在打印语句中添加编码,您应该会没事的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10603378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档