2011-10-20 38 views
5

Tôi hiện đang sử dụng thư viện httplib trong Python 2.7 để lấy một số tiêu đề từ trang web để thiết lập a) các tệp tải xuống và b) ngày sửa đổi cuối cùng của tệp. Tôi đã sử dụng một số công cụ trực tuyến và những chi tiết này tồn tại.Trích xuất thông tin từ một Tuple (Python)

Tôi hiện đang viết mã cho mã Python của mình và nó có vẻ hoạt động chính xác để đưa trở lại thông tin được yêu cầu. Tuy nhiên, phản hồi chứa thông tin tiêu đề là danh sách chứa một số bộ dữ liệu. Một ví dụ của phản ứng là dưới đây: -

[('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')] 

Những gì tôi muốn làm là loại bỏ về cơ bản kích thước tập tin ("2.501.479") và ngày ("Thu, ngày 20 tháng 10 2011 04:30:01 GMT "). Bất kỳ ý tưởng làm thế nào tôi có thể đi về việc này? Ban đầu, tôi đã thử variable[0] nhưng điều này trả về "'content-length', '2501479'". Làm thế nào tôi có thể trả lại các tập tin chỉ duy nhất (trong lý thuyết phần thứ hai của tuple đầu tiên trong danh sách!).

Trả lời

7

Đầu tiên, bạn có thể làm cho nó một chút dễ dàng hơn để làm việc với bằng cách chuyển danh sách các tuples thành một cuốn từ điển:

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

Đối ngày, tôi sẽ biến nó thành một đối tượng datetime bằng cách sử dụng chức năng email.utils.parsedate:

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

Bạn chỉ cần lập chỉ mục lại để truy cập bộ tuple. Giống như

length = variable[0][1] 
last_mod = variable[4][1] 

cho kích thước và ngày sửa đổi cuối cùng.

Lưu ý: Điều này chỉ hoạt động khi các chỉ số của content-lengthlast-modified luôn giống nhau.

4

Thứ nhất, chuyển đổi các bộ vào một dict, và sau đó chuyển đổi các giá trị cho int để có được một số:

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

Bạn đã có các bộ bên trong một mảng ... May mắn là bạn có thể tham khảo (hoặc dereference chúng tùy thuộc vào thuật ngữ của bạn) theo cùng một cách ...

vì vậy v = x [0] sẽ cung cấp cho bạn khi bạn nêu tuple ("'content-length', '2501479'") và v [0] sẽ cung cấp cho bạn 'độ dài nội dung' và v [1] sẽ cung cấp cho bạn '2501479' (mặc dù bạn có thể muốn thực hiện một int (v [0]) với điều đó có lẽ một số kiểm tra lỗi .

Bạn có thể đặt mảng đó vào dict tốt hơn; vì vậy bạn có thể chắc chắn rằng bạn đang nhận được chiều dài nội dung nếu thứ tự sẽ thay đổi.

Rất may, cú pháp gần như giống nhau - nó sử dụng toán tử []. Tuy nhiên, tôi sẽ để lại nó cho bạn để xem các trang man trăn để xem làm thế nào để chuyển đổi một mảng -> dict (không thể làm tất cả mọi thứ cho bạn !!)

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') 
Các vấn đề liên quan