2011-10-20 17 views
5

Obecnie korzystam z biblioteki httplib w Pythonie 2.7, aby uzyskać niektóre nagłówki ze strony internetowej, aby ustalić a) rozmiar pliku do pobrania i b) datę ostatniej modyfikacji pliku. Użyłem niektórych narzędzi online i te szczegóły istnieją.Wyodrębnianie informacji z krotki (Python)

Obecnie skryptuję mój kod Pythona i wygląda na to, że działa poprawnie, przywracając wymagane informacje. Niemniej jednak odpowiedź zawierająca informacje w nagłówku jest listą zawierającą liczbę krotek. Próbkę odpowiedź jest poniżej: -

[('content-length', '2501479'), 
('accept-ranges', 'bytes'), 
('vary', 'Accept-Encoding'), 
('server', 'off'), 
('last-modified', 'Thu, 20 Oct 2011 04:30:01 GMT'), 
('etag', '"2c8171a-262b67-4afb368edfffc"'), 
('date', 'Thu, 20 Oct 2011 16:01:11 GMT'), 
('content-type', 'text/plain')] 

Co szukam zrobić, to rozebrać na zasadzie rozmiar pliku („2501479”) i datę ("Sun, 20 października 2011 04:30:01 GMT "). Jakieś pomysły, jak mogę to zrobić? Pierwotnie wypróbowałem variable[0], ale to zwraca "'content-length', '2501479'". Jak mogę zwrócić plik tylko (teoretycznie druga część pierwszej krotki na liście!).

Odpowiedz

7

Po pierwsze, możesz zrobić to trochę łatwiej pracować obracając listę krotek do słownika:

>>> headers = [('content-length', '2501479'), 
... ('accept-ranges', 'bytes'), 
... ('vary', 'Accept-Encoding'), 
... ('server', 'off'), 
... ('last-modified', 'Thu, 20 Oct 2011 04:30:01 GMT'), 
... ('etag', '"2c8171a-262b67-4afb368edfffc"'), 
... ('date', 'Thu, 20 Oct 2011 16:01:11 GMT'), 
... ('content-type', 'text/plain')] 
>>> 
>>> headers = dict(headers) 
>>> int(headers['content-length']) 
2501479 

na dzień, chciałbym przekształcić go w datetime obiektu przy użyciu email.utils.parsedate funkcję:

>>> import email.utils 
>>> email.utils.parsedate(headers['date']) 
(2011, 10, 20, 16, 1, 11, 0, 1, -1) 
2

Po prostu trzeba go ponownie zindeksować, aby uzyskać dostęp do krotki. Podobnie jak

dla rozmiaru i daty ostatniej modyfikacji.

Uwaga: Działa to tylko wtedy, gdy indeksy content-length i last-modified są zawsze takie same.

4

Najpierw przekonwertować krotki do dict, a następnie przekonwertować wartość int aby uzyskać numer:

response_tupels = [('content-length', '2501479'), ('accept-ranges', 'bytes'),] 
response = dict(response_tupels) 
try: 
    content_length = int(response['content-length']) 
except KeyError: 
    raise # Handle missing content-length here 
0

Masz krotki wewnątrz tablicy ... Na szczęście można odniesienia (lub nieprawidłowego je w zależności od terminologii) ten sam sposób ...

więc v = x [0] dam wam, jak podanie krotki (" 'content-Length', '2501479'") i v [0] da ci "długość treści", a v [1] da ci "2501479" (chociaż prawdopodobnie chcesz zrobić int (v [0]) na tym z pewnymi błędami sprawdzającymi .

Być może lepiej będzie umieścić tablicę w dyktafonie; więc możesz być pewny, że wydostaniesz się z treści, jeśli zamówienie kiedykolwiek się zmieni.

Na szczęście składnia jest prawie taka sama - korzysta z operatora []. Jednak zamierzam zostawić to tobie, aby przejrzeć strony z pythonem, aby przekonwertować tablicę -> dict (nie mogę zrobić wszystkiego dla ciebie!)

0
mas = [('content-length', '2501479'), 
('accept-ranges', 'bytes'), 
('vary', 'Accept-Encoding'), 
('server', 'off'), 
('last-modified', 'Thu, 20 Oct 2011 04:30:01 GMT'), 
('etag', '"2c8171a-262b67-4afb368edfffc"'), 
('date', 'Thu, 20 Oct 2011 16:01:11 GMT'), 
('content-type', 'text/plain')] 
mas = dict(mas) 
mas.get('content-length') 
Powiązane problemy