【问题标题】:Unescape a string inside a string对字符串中的字符串进行转义
【发布时间】:2010-02-23 03:18:31
【问题描述】:

我正在使用urllib2,并尝试从Response 对象中提取可打印形式的标题。

目前我正在打印str(response.info()),但是打印的内容本身就是一个 Python 字符串(至少在我的理解中)。

(Pdb) p str(response.info())
'Date: Tue, 23 Feb 2010 03:12:26 GMT\r\nServer: Apache\r\nVary: Accept-Encoding,User-Agent\r\nContent-Encoding: gzip\r\nContent-Length: 9045\r\nConnection: close\r\nContent-Type: text/html; charset=ISO-8859-1\r\n'

我需要将该字符串转换为“实际”字符串,例如通过评估或类似的方式。我发现的最佳理论解决方案是使用:

s = str(response.info())
print s.decode("string_escape")

但这不起作用。更令人困惑的是如何处理字符串中的引号,调用eval(s)str(s) 也不起作用。

有没有更好的方法来提取响应中的原始标头而不用引用,或者像上面那样解码字符串 s 的方法?

【问题讨论】:

    标签: python string http


    【解决方案1】:

    str(info()) 确实给出一个正常的字符串:

    >>> import urllib2
    >>> f = urllib2.urlopen('http://tejp.de')
    >>> print str(f.info())
    Connection: close
    Vary: Accept-Encoding
    Content-Type: text/html
    Accept-Ranges: bytes
    ETag: "-807357257"
    Last-Modified: Wed, 01 Jul 2009 10:05:34 GMT
    Content-Length: 285
    Date: Tue, 23 Feb 2010 03:24:10 GMT
    Server: lighttpd/1.4.19
    

    只有调试器的p 命令以转义形式打印字符串。

    【讨论】:

    • 观察力好;但是,这并不能回答如何取消转义字符串的问题。
    • @Beau:这是为了帮助 OP 做他真正想做的事情,正如他帖子的第一行所述。从字面上回答标题中的问题根本不会帮助他。如果您正在寻找答案,this question 可能会有所帮助。
    【解决方案2】:

    从 pdb,这应该可以工作:

    print str(response.info())
    

    不过,不确定这是否能回答您的问题。

    【讨论】:

    • 是的,它返回一个 python 转义字符串,并打印出引号和所有内容。我追求的是什么
    • 我的机器上没有。 p 打印 Python 语法字符串,而 print 产生没有可见转义的多行输出。
    • p 是一个调试器命令。 print 不是调试器命令,因此作为 python 语句执行
    • +1:您是对的,但没有将调试器行为与我的问题联系起来。
    【解决方案3】:

    response.info() 返回一个httplib.HTTPMessage,其行为类似于映射:

    info = response.info()
    for k, v in info.items():
      print '%s: %s' % (k, v)
    

    总之,你做错了。

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多