2015-01-06 22 views
12

Tôi đang cố gắng tự rèn luyện một số trang web cơ bản. Sử dụng mô-đun yêu cầu Python, tôi đã có thể lấy html cho các trang web khác nhau cho đến khi tôi cố gắng này:Nhận html bằng cách sử dụng các yêu cầu Python?

>>> r = requests.get('http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F') 

Thay vì html cơ bản đó là nguồn cho trang này, tôi nhận được:

>>> r.text 
'\x1f\ufffd\x08\x00\x00\x00\x00\x00\x00\x03\ufffd]o\u06f8\x12\ufffd\ufffd\ufffd+\ufffd]... 

>>> r.content 
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xed\x9d]o\xdb\xb8\x12\x86\xef\xfb+\x88]\x14h... 

tôi đã thử nhiều kết hợp nhận/đăng với mọi cú pháp tôi có thể đoán từ tài liệu và từ SO và các ví dụ khác. Tôi không hiểu những gì tôi nhìn thấy ở trên, đã không thể biến nó thành bất cứ điều gì tôi có thể đọc, và không thể tìm ra cách để có được những gì tôi thực sự muốn. Câu hỏi của tôi là, làm thế nào để tôi nhận được html cho trang trên?

+0

Dường như làm việc ở đây, chỉ cần thử nó với các url chính xác trên Python 2,7 – Kroltan

+0

'test = html.fromstring (r.text)' Id –

+1

khuyên BeautifulSoup cho web cào http: // đẹp-soup- 4.readthedocs.org/en/latest/#. Nó sẽ làm cho cuộc sống của bạn trở nên dễ dàng hơn rất nhiều. – Ron

Trả lời

13

Máy chủ được đề cập đang cung cấp cho bạn một phản hồi gzipped . Máy chủ cũng là rất bị hỏng; nó sẽ gửi các tiêu đề sau:

$ curl -D - -o /dev/null -s -H 'Accept-Encoding: gzip, deflate' http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F 
HTTP/1.1 200 OK 
Date: Tue, 06 Jan 2015 17:46:49 GMT 
Server: Apache 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"><html xmlns="http: //www.w3.org/1999/xhtml" lang="en-US"> 
Vary: Accept-Encoding 
Content-Encoding: gzip 
Content-Length: 3659 
Content-Type: text/html 

Dòng <!DOCTYPE..>không phải là một tiêu đề HTTP hợp lệ. Do đó, các tiêu đề còn lại trong quá khứ Serverbị bỏ qua. Tại sao máy chủ xen vào đó là không rõ ràng; trong tất cả các mui xe có khả năng WRCCWrappers.py là một tập lệnh CGI không xuất các tiêu đề nhưng không bao gồm một dòng mới đôi sau dòng doctype, hãy ghép máy chủ Apache vào chèn các tiêu đề bổ sung ở đó.

Vì vậy, requests cũng không phát hiện thấy dữ liệu được mã hóa gzip. Dữ liệu là tất cả ở đó, bạn chỉ cần giải mã nó. Hoặc bạn có thể nếu nó không phải là khá không đầy đủ.

công việc xung quanh là bảo với máy chủ không phải bận tâm với nén:

headers = {'Accept-Encoding': 'identity'} 
r = requests.get(url, headers=headers) 

và một phản ứng không nén được trả về.

Ngẫu nhiên, trên Python 2 phân tích cú pháp HTTP tiêu đề không phải là quá nghiêm ngặt và quản lý để khai báo DOCTYPE một tiêu đề:

>>> pprint(dict(r.headers)) 
{'<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "dtd/xhtml1-transitional.dtd"><html xmlns="http': '//www.w3.org/1999/xhtml" lang="en-US">', 
'connection': 'Keep-Alive', 
'content-encoding': 'gzip', 
'content-length': '3659', 
'content-type': 'text/html', 
'date': 'Tue, 06 Jan 2015 17:42:06 GMT', 
'keep-alive': 'timeout=5, max=100', 
'server': 'Apache', 
'vary': 'Accept-Encoding'} 

và thông tin content-encoding sống sót, do đó requests giải mã nội dung cho bạn, như mong đợi .

+0

Nó hoạt động tốt cho tôi bằng cách sử dụng 'yêu cầu 2.4.3' –

+0

@PadraicCunningham: không phải với 2.5.1. Máy chủ phản hồi bằng kết hợp HTTP và HTML. –

+0

@PadraicCunningham: Python 2 hoặc Python 3? Điều đó có thể ảnh hưởng nhiều hơn ở đây. –

0

Tiêu đề HTTP cho URL này hiện đã được sửa.

>>> import requests 
>>> print requests.__version__ 
2.5.1 
>>> r = requests.get('http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F') 
>>> r.text[:100] 
u'\n<!DOCTYPE html>\n<HTML>\n<HEAD><TITLE>Monthly Average of Precipitation, Station id: 028815</TITLE></H' 
>>> r.headers 
{'content-length': '3672', 'content-encoding': 'gzip', 'vary': 'Accept-Encoding', 'keep-alive': 'timeout=5, max=100', 'server': 'Apache', 'connection': 'Keep-Alive', 'date': 'Thu, 12 Feb 2015 18:59:37 GMT', 'content-type': 'text/html; charset=utf-8'} 
Các vấn đề liên quan