【问题标题】:Python urllib2 decode chunked encodingPython urllib2 解码分块编码
【发布时间】:2011-08-28 13:59:20
【问题描述】:

我有以下代码来打开和读取 URL:

html_data = urllib2.urlopen(req).read()

我相信这是从 HTTP 读取数据的最标准方式。 但是,当响应有chunked tranfer-encoding 时,响应以以下字符开头:

1eb0\r\n2625\r\n
<?xml version="1.0" encoding="UTF-8"?>
...

由于上述分块编码而发生这种情况,因此我的 XML 数据被损坏。

所以我想知道如何摆脱与分块编码相关的所有元数据?

【问题讨论】:

  • 当您尝试在 Web 浏览器中加载源数据时会发生什么?你买的是 1eb0 还是 2625?这些(和其他)数字是否一致?
  • 不,浏览器正确处理

标签: python urllib2 chunked-encoding httplib


【解决方案1】:

我最终得到了自定义 xml 剥离,如下所示:

    xml_start = html_data.find('<?xml')
    xml_end = html_data.rfind('</mytag>')
    if xml_start !=0:
        log_user_action(req.get_host() ,'chunked data', html_data, {})
        html_data = html_data[xml_start:]
    if xml_end != len(html_data)-len('</mytag>')-1:
        html_data = html_data[:xml_end+1]

找不到任何简单的解决方案。

【讨论】:

    【解决方案2】:

    1eb0\r\n2625\r\n 是重新组装的有效载荷中的段开始/停止位置(十六进制)

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
    • @StevenRumbalski 我的评论是针对删除元数据的评论。简单地忽略这些值并假设您在有效负载中得到的就是预期的数据是不明智的。元数据应用于验证您拥有的有效负载是否与您打算操作的块匹配。换句话说,不要只是天真地尝试查找 xml 并忽略分块信息,否则您可能会因为事情乱序或丢失而最终得到格式错误的数据块。使用元数据来确保正确的块重组。
    【解决方案3】:

    您可以删除 ?xml 之前的所有内容

    html_data = html_data[html_data.find('<?xml'):]
    

    【讨论】:

    • 不幸的是我不能。分块编码还在有效载荷之后添加了一些元数据。我已经给出了我的转储的开头作为一个例子。
    猜你喜欢
    • 2013-02-13
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2019-12-19
    • 2012-04-10
    • 2019-06-26
    • 2015-03-15
    相关资源
    最近更新 更多