2014-07-14 34 views
9

python 2.7 kullanıyorum ve zaten bir metin dosyasından ayıkladığım dize HTTP yanıt alanlarını ayrıştırmak istiyorum. En kolay yol ne olurdu? İstekleri BaseHTTPServer kullanarak ayrıştırabilirim, ancak yanıtlar için bir şey bulamadı. Benpython ayrıştırma http yanıtı (string)

yanıtları önceden

HTTP/1.1 200 OK 
Date: Thu, Jul 3 15:27:54 2014 
Content-Type: text/xml; charset="utf-8" 
Connection: close 
Content-Length: 626 

sayesinde oldukça standart ve aşağıdaki biçimdedir

cevap

16

Sen HTTPResponse üzere tasarlanmamıştır unutmayın, bu konuda yararlı olabilecek "kullanıcı tarafından doğrudan başlatılamaz." Ayrıca, yanıt dizenizdeki içerik uzunluğu üstbilgisinin artık geçerli olmayabileceğini de unutmayın (bu yanıtları nasıl aldığınıza bağlı olarak değişir), bu yalnızca HTTPResponse.read() öğesine yapılan çağrının değere sahip olması gerektiği anlamına gelir. hepsini elde etmek için içerikten daha büyük.

Bu örnek, python v2'ye özgüdür, v3-ish'de StringIO için içe aktarma konumları ve httplib değişmiştir.

from httplib import HTTPResponse 
from StringIO import StringIO 

http_response_str = """HTTP/1.1 200 OK 
Date: Thu, Jul 3 15:27:54 2014 
Content-Type: text/xml; charset="utf-8" 
Connection: close 
Content-Length: 626""" 

class FakeSocket(): 
    def __init__(self, response_str): 
     self._file = StringIO(response_str) 
    def makefile(self, *args, **kwargs): 
     return self._file 

source = FakeSocket(http_response_str) 
response = HTTPResponse(source) 
response.begin() 
print "status:", response.status 
print "single header:", response.getheader('Content-Type') 
print "content:", response.read(len(http_response_str)) # the len here will give a 'big enough' value to read the whole content 
+0

Bu gerçekten ihtiyacım olan hile gibi görünüyor. Muhtemelen basit amaçlar için düzenli ifadeler kullanarak yolumdan çalışabilirdim, ancak HTTPResponse kullanmak çok daha doğru bir şekilde hissediyor. Çok teşekkürler. –

+1

Bir takip, test ve evet olarak, istediğimi yapar. –

+0

ama hayatta kalma bağlantısı varsa ne olur? Bu çözümü kullanarak çoklu üstbilgileri/gövdeyi ayrıştırabilir miyiz? Bu yanıtsız soruya örnek olarak: http://stackoverflow.com/questions/34786880/multiple-response-parsing-in-python?lq=1 – sajjadG

3

Sen piton-istekleri kullanarak düşünebilirsiniz.

Bağlantı: İşte

http://dancallahan.info/journal/python-requests/ bir örnek düşünüldüğünde edilir cevaplarınız

bu yapmak istediğiniz bir şey gibi görünüyor mu HTTP RFC ile uyumlu?

>>> import requests 
>>> url = 'http://example.test/' 
>>> response = requests.get(url) 
>>> response.status_code 
200 
>>> response.headers['content-type'] 
'text/html; charset=utf-8' 
>>> response.content 
u'Hello, world!' 
+3

Bu soru nasıl yanıtlanır? – saaj

+0

Zaten varolan bir yanıt dizesini buna nasıl yüklersiniz? – luckydonald