2014-07-14 16 views
9

Używam Pythona 2.7 i chcę parsować ciąg pól odpowiedzi HTTP, które już zostały wyodrębnione z pliku tekstowego. Jaki byłby najprostszy sposób? Mogę analizować żądania za pomocą BaseHTTPServer, ale nie udało się znaleźć czegoś dla odpowiedzi.python parsować http odpowiedź (ciąg)

Odpowiedzi mam dość standardowy i w następującym formacie

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 

Dzięki z góry,

Odpowiedz

16

Można znaleźć to przydatne, należy pamiętać, że HTTPResponse nie został zaprojektowany, aby być „wystąpienia bezpośrednio przez użytkownika.”

Należy również zauważyć, że nagłówek długości treści w łańcuchu odpowiedzi może już nie być poprawny (zależy to od sposobu uzyskania tych odpowiedzi), oznacza to tylko, że wywołanie funkcji HTTPResponse.read() musi mieć wartość większy niż zawartość, aby uzyskać wszystko.

Ten przykład jest specyficzny dla Pythona v2, w wersjach V3 zmieniono lokalizacje importu dla StringIO i httplib.

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

To naprawdę wygląda na lewę, jakiej potrzebowałem. Prawdopodobnie mógłbym sobie poradzić poprzez użycie wyrażeń regularnych dla moich prostych celów, ale używanie HTTPResponse wydaje się dużo bardziej poprawne. Dziękuję bardzo. –

+1

Jako kontynuacja, przetestowany i tak, robi to, co chcę. –

+0

, ale co, jeśli istnieje połączenie podtrzymujące połączenie? czy możemy analizować wiele nagłówków/treści za pomocą tego rozwiązania? coś jak przykład tego pytania bez odpowiedzi: http://stackoverflow.com/questions/34786880/multiple-response-parsing-in-python?lq=1 – sajjadG

3

Można rozważyć użycie Pythona żądań.

Link:

Oto przykład z http://dancallahan.info/journal/python-requests/

rozpatrywaniu odpowiedzi są zgodne z RFC HTTP

Czy to wygląda jak coś, co chcesz zrobić?

>>> 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

Jak ta odpowiedź na pytanie? – saaj

+0

Jak załadowałbyś już istniejący łańcuch odpowiedzi? – luckydonald