【问题标题】:Losing codification when split a string拆分字符串时丢失编码
【发布时间】:2012-02-26 13:52:25
【问题描述】:

[编辑]

我正在使用 Google App Engine,我正在尝试解析 HTML 内容以提取一些信息。我正在使用的代码是:

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.api import urlfetch
import BeautifulSoup

class MainHandler(webapp.RequestHandler):
    def get(self):
        url = 'http://ascodevida.com/ultimos'
        result = urlfetch.fetch(url=url)
        # ADVS de esta página.
        res = BeautifulSoup.BeautifulSoup(result.content).findAll('div', {'class' : 'box story'})
        ADVList = []
        for i in res:
            story = i.find('a', {'class' : 'advlink'}).string
            link = i.find('a', {'class' : 'advlink'})['href']
            ADVData = {
                'adv' : story,
                'link' : link
            }
            ADVList.append(ADVData)

        self.response.headers['Content-Type'] = 'text/html; charset=UTF-8'
        self.response.out.write(ADVList)

这段代码会产生一个带有奇怪字符的响应。我尝试使用 BeautifulSoup 库的 prettify() 和 renderContent() 方法,但效果不佳。

有什么解决办法吗?再次感谢。

【问题讨论】:

  • 你的意思是访问 res[0] 时没问题,但是访问 [x in res] 时输出很奇怪?你能展示一些内容的例子吗?
  • 通过正则表达式甚至字符串拆分/搜索来解析 HTML 是完全错误的。永远不要这样做。
  • @springrider 是的。内容如下所示:“mi hermana se hab\xeda sacado su port\xe1til de casa。” (它是西班牙语,奇怪的字符是 \xed = í 和 \xe1 = á)。
  • @Odomontois 这样做的正确方法是什么?

标签: python google-app-engine encoding utf-8 urlfetch


【解决方案1】:

我是一名 java 开发人员,我正在使用 jsoup 进行 HTML 解析。我为python找到了类似的一个。这可能会帮助您并节省您的时间。

http://www.crummy.com/software/BeautifulSoup/

大脑的食物: Python regular expression for HTML parsing (BeautifulSoup)

【讨论】:

  • 谢谢!这是解析 HTML 内容并仅提取我需要的元素的方法。
  • 嗯......它继续显示奇怪的字符,但现在我可以轻松获得价值。我可以做什么?我已经阅读了 BeautifulSoup 的文档,但它没有正确编码文档......
  • 你能给我网址吗?或该 URL 的示例内容?
  • 我在本地主机上工作。如果您愿意,我可以粘贴所有代码和响应。
  • 粘贴您尝试解析的响应部分。
【解决方案2】:

我认为你是直接打印列表,它调用repr,默认输出为十六进制格式(如\xe1)。

你可以试试这个:

>>> s = u"Leer más"
>>> repr(s)
"'Leer m\\xc3\\xa1s'"

但 print 语句会尝试解码字符串:

>>> print s
Leer más

如果您想要正确的结果,请避免列表的默认行为并自己处理每个项目。

【讨论】:

  • 没错!问题来自 Google App Engine 框架:我无法使用 print 在浏览器中显示结果。我必须使用 "self.response.out.write(u"Leer más") 将响应器呈现给浏览器。我还尝试在 var ( s = "%s" % u" 中“打印”内容阅读更多"),但似乎没有任何效果。
  • 你的意思是 "s = "%s" % u"Leer más"" 也不起作用吗?我测试了一下,没问题,mytestapp12345.appspot.com你是不是在文件头加了“#coding=utf-8”?
  • 我已经在文件头中添加了编码信息,但它不起作用。我认为这是我正在渲染的页面的问题,它没有编码,并且使 App Engine 变得“疯狂”,带有奇怪的字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2016-03-27
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多