В чем разница между "содержанием" и "текстом"

122

Я использую потрясающую библиотеку запросов Python . Я заметил, что в прекрасной документации есть много примеров того, как что-то делать, без объяснения причины . Например, оба r.textи r.contentпоказаны в качестве примеров того, как получить ответ сервера. Но где объясняется, что делают эти свойства? Например, когда я выберу одно из них? Я вижу, что thar иногдаr.text возвращает объект Unicode , и полагаю, что для нетекстового ответа будет разница. Но где все это задокументировано? Обратите внимание, что в связанном документе говорится:

Вы также можете получить доступ к телу ответа в байтах для нетекстовых запросов:

Но затем мы покажем пример текстового ответа! Я могу только предположить, что приведенная выше цитата означает non-text responsesвместо этого non-text requests, поскольку нетекстовый запрос не имеет смысла в HTTP.

Короче говоря, где находится надлежащая документация по библиотеке, в отличие от (отличного) учебника на сайте Python Requests?

dotancohen
источник

Ответы:

144

В интерфейсе разработчика есть более подробная информация:

r.text- это содержимое ответа в Юникоде, а r.contentэто содержимое ответа в байтах.

Гэри Керр
источник
46
И когда бы вы выбрали то или другое?
multigoodverse
13
@multigoodverse: вероятно r.text, будет предпочтительнее для текстовых ответов, таких как документ HTML или XML, и r.contentпредпочтительнее для «двоичных» типов файлов, таких как изображение или файл PDF.
dotancohen
5
@dotancohen HTML и XML используют объявления в данных, чтобы выполнять собственное декодирование, поэтому они должны подаваться в необработанном r.content, а не в скрытом виде r.text.
tdelaney 06
В более общем смысле, один ответ может содержать вложенное или составное содержимое (например, сообщения электронной почты с вложениями), и каждая часть может быть закодирована по-разному. Невозможно обрабатывать такие ответы без доступа к байтовому потоку, но это далеко от общего случая, когда вам просто нужен правильно декодированный текст Unicode.
holdenweb 08
Почему интерпретатор Python показывает и r.textи в r.contentвиде текста. Почему бы не отображать r.contentкак текст и r.textкак биты (если это по сути)?
Arnb
11

Из документации ясно, что r.content

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

 >>> r.content

Если вы читаете дальше по странице, он обращается, например, к файлу изображения

PyNEwbie
источник
2
Спасибо. Теперь я вижу небольшой bпредыдущий пример с текстом «для нетекстовых запросов», что означает, что объект является байтовым объектом. Непонятно, почему байты отображаются как текст, возможно, это еще одна «тонкость» Python, но в данном контексте это сбивает с толку. Спасибо.
dotancohen 09
1
похоже, это имеет большее значение для python 3.x, чем для python 2.x; использование requestsв python 3 на странице page.content дает эту ошибку: if 'rss' in page.content:->TypeError: a bytes-like object is required, not 'str'
Marc Maxmeister