我将整个HTTP响应作为字符串获取,但我只想提取正文。

我不想使用外部库或重新实现标头解析。

Content-Type: text/xml
Content-Length: 129

<?xml version='1.0'?>
<methodResponse>
<params>
<param>
<value><boolean>0</boolean></value>
</param>
</params>
</methodResponse>
</code>

更新:如果不是很明显,我确实会从URL以外的其他来源获取数据,因此任何尝试使用需要的内容且URL都是没有用的。

我仍然从对象data = stream.read()类的流中读取数据,因此可以使用流的解决方案也是可以接受的。

第二次更新 ,是的,这是XMLRPC响应,但这是我正在使用其他传输方式,因此我无法使用httplib对其进行解析,主要是因为httplib损坏并且不接受字符串或流进行解析。

第三次更新时 ,基于服务器,双换行符可以是\\r\\n\\r\\n\\n\\n

因此,明确地说:输入是HTTP response that is supposed to contain an XMLRPC response and the output has to be the responseHTTP response that is supposed to contain an XMLRPC response and the output has to be the response 它不必解析XML,但必须能够从响应中正确提取XML。

===============>>#1 票数:5 已采纳

基于Michal解决方案,但此解决方案包括一个基本修复:

def strip_http_headers(http_reply):
    p = http_reply.find('\r\n\r\n')
    if p >= 0:
        return http_reply[p+4:]
    return http_reply

===============>>#2 票数:2

在HTTP响应中,标头由正文和正文以两个CRLF字符分隔。 因此,您可以像这样使用string.find()方法:

p = http_reply.find('\r\n\r\n')
if p >= 0:
    return http_reply[p:]
return http_reply

===============>>#3 票数:2

简短而甜美:

body = response.split('\r\n\r\n', 1)[-1]

(它使用split()两个参数版本, [-1]表示数组的最后一个元素)

===============>>#4 票数:2

resp = ('Content-Type: text/xml\r\n'
        'Content-Length: 129\r\n'
        "<?xml version='1.0'?>\r\n"
        '\r\n'
        '<methodResponse>\r\n'
        '<params>\r\n'
        '<param>\r\n'
        '<value><boolean>0</boolean></value>\r\n'
        '</param>\r\n'
        '</params>\r\n'
        '</methodResponse>\r\n'
        '</code>')

print resp.partition('\r\n\r\n')[2]

结果

<methodResponse>
<params>
<param>
<value><boolean>0</boolean></value>
</param>
</params>
</methodResponse>
</code>

在我的显示器上,字符“ \\ r”在每行末尾显示为正方形。

partition()的优点是它总是返回一个由3个元素组成的元组:
然后,如果文本中没有序列“ \\ r \\ n \\ r \\ n”,
resp.partition('\\r\\n\\r\\n')[2]将为""
split('\\r\\n\\r\\n')[1]会导致错误,而split('\\r\\n\\r\\n')[-1]是整个文本。

编辑

如果双换行符是可变的,则只有一个正则表达式可以保存可变性。
有必要知道制作正则表达式模式的可变性范围是多少。

假设只能使用“ \\ n \\ n”,“ \\ r \\ n \\ n”,“ \\ n \\ r \\ n”和“ \\ r \\ n \\ r \\ n”,一种解决方案是用正则表达式的帮助基于以下模式:

import re

regx = re.compile('(?:(?:\r?\n){2}|\Z)(.+)?',re.DOTALL)

for ss in (('Content-Type: text/xml\r\n'
            'Content-Length: 129\r\n'
            "<?xml version='1.0'?>\n"
            '\n'
            'body1\r\n'
            '<params>\r\n'
            '<param>\r\n'
            '</code>') ,
           ('Content-Type: text/xml\r\n'
            'Content-Length: 129\r\n'
            "<?xml version='1.0'?>\r\n"
            '\n'
            'body2\r\n'
            '<params>\r\n'
            '<param>\r\n'
            '</code>') ,
           ('Content-Type: text/xml\r\n'
            'Content-Length: 129\r\n'
            "<?xml version='1.0'?>\n"
            '\r\n'
            'body3\r\n'
            '<params>\r\n'
            '<param>\r\n'
            '</code>') ,
           ('Content-Type: text/xml\r\n'
            'Content-Length: 129\r\n'
            "<?xml version='1.0'?>\r\n"
            '\r\n'
            'body4\r\n'
            '<params>\r\n'
            '<param>\r\n'
            '</code>') ,
           ('Content-Type: text/xml\r\n'
            'Content-Length: 129\r\r'
            "<?xml version='1.0'?>\r\r"
            '\r\n'
            'body4\r\n'
            '<params>\r\n'
            '<param>\r\n'
            '</code>') ,):
    print ('splitting on sequence  :  %r\n%r\n') \
           % (re.search('(?:\r?\n)+(?=body)',ss).group(),
              regx.search(ss).group(1))

结果

splitting on sequence  :  '\n\n'
'body1\r\n<params>\r\n<param>\r\n</code>'

splitting on sequence  :  '\r\n\n'
'body2\r\n<params>\r\n<param>\r\n</code>'

splitting on sequence  :  '\n\r\n'
'body3\r\n<params>\r\n<param>\r\n</code>'

splitting on sequence  :  '\r\n\r\n'
'body4\r\n<params>\r\n<param>\r\n</code>'

splitting on sequence  :  '\r\n'
None

===============>>#5 票数:1

您可以使用标准的urllib2

from urllib2 import urlopen
data = urlopen('http://url.here/').read()

如果您想解析xml

from urllib2 import urlopen
from xml.dom.minidom import parse

xml = parse(urlopen('http://url.here'))

===============>>#6 票数:1

除了Tito所说的之外,还有请求

>>> import requests
>>> r = requests.get("http://yoururl")
>>> r
<Response [200]>
>>> r.content
...

然后使用minidom或为此选择的任何工具对其进行解析。

  ask by sorin translate from so

未解决问题?本站智能推荐:

2回复

python parse http响应(字符串)

我正在使用python 2.7,我想解析已经从文本文件中提取的字符串HTTP响应字段。 最简单的方法是什么? 我可以使用BaseHTTPServer解析请求,但无法为响应找到内容。 我的回复非常标准,并采用以下格式 提前致谢,
3回复

如何在Python中解析HTTP日期字符串?

有没有一种简单的方法来解析Python中的HTTP日期字符串? 根据标准 ,有几种方法可以格式化HTTP日期字符串; 该方法应该能够处理这个问题。 换句话说,我想将像“Wed,2009年9月23日22:15:29 GMT”这样的字符串转换为python时间结构。
1回复

Django http有时会以包含unicode字符的长字符串作为响应

我正在构建一个arduino项目,该项目从运行django Web应用程序的raspberry pi服务器请求状态。 该Web应用程序很简单,它将一个开关的状态存储在数据库中(True或False表示打开或关闭)。 我有一个视图,返回状态为“ Status:1”或“ Status:0”形式的
2回复

用python获取http响应代码

我知道如何使用httplib执行此操作,但我还需要设置用户代理,并且我确定您需要urllib来执行此操作。 如何使用urllib获取http响应代码?
1回复

在http.client或python-requests中获取http原始(未解析)响应

我正在使用Python来发出HTTP请求。 我需要原始HTTP响应,如下所示: 在python请求中我尝试了response.raw ,但它不是原始的HTTP响应,它只是原始的。 有没有办法在不使用socket情况下实现这个目标? PS我不想使用解析的部分重建原始响应。
3回复

如何在不回复Python中的http响应的情况下发出http请求?

我想发送它并忘记它。 我正在进行的http休息服务呼叫需要几秒钟才能响应。 目标是避免在更多代码执行之前等待几秒钟。 我宁愿不使用python线程我会使用扭曲的异步调用,如果我必须忽略响应。
1回复

在Python中打印完整的HTTP / 2 gRPC响应

我在Python中有一个gRPC服务器,我正在寻找一种方法来打印收到请求后提供的完整HTTP / 2响应。 下面是接收请求并返回响应的方法。
1回复

在HTTP响应Python中缺少cookie

我正在为Sickbeard建立一个额外的提供商,并且我的cookie存在问题。 我一直在寻找很长一段时间之后为什么在使用请求时HTTP响应中缺少cookie。 cookie: 响应只包含一个 cookie的cookie: | 登录提供程序时我得到(并且想要)的cookie是 |
2回复

通过不完整的HTTP JSON响应完成JSON字符串

有时我会从json api下载数据,但由于网络超时或其他一些问题,它会中途中断。 但是,在这种情况下,我希望能够读取可用数据。 这是一个例子: 我希望能够“完成字符串”,以便能够将不完整的响应解析为json。 例如: 我如何使用上面这样的任意构造的json对象执行上述操作?
4回复

Python-在http响应流中查找

使用urllibs (或urllibs2 )并想要我想要的东西是没有希望的。 有什么办法吗?