Sự khác biệt giữa 'nội dung' và 'văn bản'


122

Tôi đang sử dụng thư viện Yêu cầu Python tuyệt vời . Tôi nhận thấy rằng tài liệu tốt có nhiều ví dụ về cách làm điều gì đó mà không giải thích lý do tại sao . Ví dụ: cả hai r.textr.contentđược hiển thị dưới dạng ví dụ về cách nhận phản hồi của máy chủ. Nhưng ở đâu nó được giải thích những đặc tính này làm gì? Ví dụ, khi nào tôi sẽ chọn cái này hơn cái kia? Tôi thấy đôi khi thar r.texttrả về một đối tượng unicode và tôi cho rằng sẽ có sự khác biệt đối với phản hồi không phải văn bản. Nhưng tất cả những điều này được ghi lại ở đâu? Lưu ý rằng tài liệu được liên kết có trạng thái:

Bạn cũng có thể truy cập nội dung phản hồi dưới dạng byte, đối với các yêu cầu không phải văn bản:

Nhưng sau đó nó tiếp tục hiển thị một ví dụ về phản hồi văn bản! Tôi chỉ có thể cho rằng câu trích dẫn ở trên có nghĩa là nói non-text responsesthay vì non-text requests, vì một yêu cầu không phải văn bản không có ý nghĩa trong HTTP.

Tóm lại, đâu là tài liệu thích hợp của thư viện, trái ngược với hướng dẫn (tuyệt vời) trên trang Yêu cầu Python?


Câu trả lời:


144

Các giao diện nhà phát triển có thêm chi tiết:

r.textlà nội dung của phản hồi trong Unicode và r.contentlà nội dung của phản hồi tính bằng byte.


46
Và khi nào bạn sẽ chọn cái này hay cái kia?
multigoodverse

13
@multigoodverse: Có lẽ r.textsẽ được ưu tiên cho các phản hồi dạng văn bản, chẳng hạn như tài liệu HTML hoặc XML và r.contentsẽ được ưu tiên cho các loại tệp "nhị phân", chẳng hạn như hình ảnh hoặc tệp PDF.
dotancohen

5
@dotancohen HTML và XML sử dụng các khai báo trong dữ liệu để thực hiện việc giải mã của riêng chúng và vì vậy chúng phải được cung cấp nguyên dạng r.contentchứ không phải được che đậy r.text.
tdelaney

Nói chung hơn, một phản hồi có thể chứa nội dung lồng nhau hoặc nhiều phần (như thư email có tệp đính kèm) và mỗi phần có thể được mã hóa theo các cách khác nhau. Không thể xử lý các phản hồi như vậy mà không có quyền truy cập vào luồng byte, nhưng đó là một chặng đường dài so với trường hợp phổ biến, nơi bạn chỉ muốn văn bản Unicode được giải mã chính xác.
holdenweb

Tại sao trình thông dịch python hiển thị cả hai r.textr.contentdưới dạng văn bản. Tại sao không hiển thị r.contentdưới dạng văn bản và r.textdưới dạng bit (nếu đó là những gì vốn có)?
Arnb

11

Có vẻ như rõ ràng từ tài liệu là r.content

You can also access the response body as bytes, for non-text requests:

 >>> r.content

Nếu bạn đọc thêm xuống trang, nó sẽ giải quyết ví dụ: một tệp hình ảnh


2
Cảm ơn bạn. Bây giờ tôi thấy bví dụ nhỏ trước ví dụ đầu tiên có văn bản "cho các yêu cầu không phải văn bản", có nghĩa là đối tượng là một đối tượng byte. Không rõ tại sao các byte lại được hiển thị dưới dạng văn bản, có lẽ đó là một 'goodty' khác của Python, nhưng nó gây nhầm lẫn trong ngữ cảnh này. Cảm ơn.
dotancohen

1
điều này có vẻ quan trọng hơn với python 3.x so với python 2.x; sử dụng requeststrong python 3 trên page.content cho lỗi này: if 'rss' in page.content:->TypeError: a bytes-like object is required, not 'str'
Marc Maxmeister
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.