【问题标题】:App-Engine Parse a UrlFetch UTF-8 encoded streamApp-Engine 解析 UrlFetch UTF-8 编码流
【发布时间】:2012-11-13 10:23:41
【问题描述】:

我正在尝试使用 xml.sax 解析器从 URL 解析 XML。我知道还有其他库可以使用,但来自 Java 这是我最熟悉的库,对我来说似乎最不复杂。

我用来解析的代码如下:

parser = xml.sax.make_parser()
handler = MangaHandler()
parser.setContentHandler(handler)
url = urlfetch.Fetch('http://www.mangapanda.com/alphabetical', allow_truncated = False, follow_redirects = False, deadline = False)
xml.sax.parseString(url.content, handler)

一旦解析器到达第一个 & 符号,这将返回 SaxException(无效令牌):

SAXParseException: <unknown>:582:34: not well-formed (invalid token)

因为urlfetch 返回的是字符串而不是流,所以我不能使用parse()(仅适用于流),只能使用parseString()。要查看解析为流是否可以解决此问题,我尝试了:

parser.parse(io.StringIO(url.content).encode('utf-8'))

但这会返回:

TypeError: initial_value must be unicode or None, not str

我也尝试使用urllib2 库,它确实返回流而不是urlfetch,但文件太大并且会自动截断,导致数据丢失。

非常感谢任何解决此问题的方法,因为我花了几天时间绕过一个障碍,只是为了被另一个障碍阻止。

【问题讨论】:

  • 要获取 unicode,您必须使用 decode('utf-8')。当我开始使用 Python 时,这也让我感到困惑。
  • 由于更新远离我而无法尝试此操作,现在我无法回滚 -___-
  • 没用。 parser.parse(io.StringIO(url.content).decode('utf-8')) TypeError: initial_value must be unicode or None, not str
  • 我想你想要:io.StringIO(url.content.decode('utf-8'));您正在将 url 内容作为 utf-8 解码为 Unicode。

标签: python google-app-engine parsing encoding streaming


【解决方案1】:

在 python 2.X 中,str 类型实际上是一个字节数组,可以包含任何编码的字符串。

下载编码为 UTF8 的内容时,您通常会将其作为编码 str(如果未编码,则不可能是str,因为@ 987654324@ 是一个单字节字符数组)。在这种情况下,您应该使用decode('utf8') 将编码的str 转换为(解码的)unicode,这基本上是一个两字节字符的数组。

然后您可以将unicode 实例放入io.StringIO 实例中以创建类似对象的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 2016-03-10
    • 2011-10-29
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多