¿Cuál es la diferencia entre 'contenido' y 'texto'

122

Estoy usando la fabulosa biblioteca Python Requests . Noto que la buena documentación tiene muchos ejemplos de cómo hacer algo sin explicar el por qué . Por ejemplo, ambos r.texty r.contentse muestran como ejemplos de cómo obtener la respuesta del servidor. Pero, ¿dónde se explica qué hacen estas propiedades? Por ejemplo, ¿cuándo elegiría uno sobre el otro? Veo que r.texta veces devuelve un objeto Unicode , y supongo que habría una diferencia para una respuesta sin texto. Pero, ¿dónde está documentado todo esto? Tenga en cuenta que el documento vinculado dice:

También puede acceder al cuerpo de la respuesta como bytes, para solicitudes que no sean de texto:

¡Pero luego pasa a mostrar un ejemplo de una respuesta de texto! Solo puedo suponer que la cita anterior significa decir en non-text responseslugar de non-text requests, ya que una solicitud sin texto no tiene sentido en HTTP.

En resumen, ¿dónde está la documentación adecuada de la biblioteca, a diferencia del (excelente) tutorial en el sitio de Python Requests?

dotancohen
fuente

Respuestas:

144

La interfaz de desarrollador tiene más detalles:

r.textes el contenido de la respuesta en Unicode y r.contentes el contenido de la respuesta en bytes.

Gary Kerr
fuente
46
¿Y cuándo elegirías uno u otro?
Multigoodverse
13
@multigoodverse: presumiblemente r.textse preferiría para respuestas textuales, como un documento HTML o XML, y r.contentsería preferible para tipos de archivo "binarios", como una imagen o un archivo PDF.
dotancohen
5
@dotancohen HTML y XML usan declaraciones en los datos para hacer su propia decodificación y, por lo tanto, deben ser alimentados sin procesar r.content, no encubiertos r.text.
tdelaney
De manera más general, una sola respuesta puede contener contenido anidado o de varias partes (como mensajes de correo electrónico con archivos adjuntos) y cada parte puede estar codificada de diferentes formas. Es imposible manejar tales respuestas sin acceso al flujo de bytes, pero está muy lejos del caso común, donde solo desea texto Unicode correctamente descodificado.
holdenweb
Por qué el intérprete de Python muestra ambos r.texty r.contentcomo textos. ¿Por qué no mostrarse r.contentcomo texto y r.textcomo bits (si eso es lo que es inherentemente)?
Arnb
11

Parece claro a partir de la documentación que r.content

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

 >>> r.content

Si lee más abajo en la página, se trata, por ejemplo, de un archivo de imagen.

PyNEwbie
fuente
2
Gracias. Ahora veo el pequeño que bprecede al primer ejemplo con el texto "para solicitudes que no son de texto", lo que significa que el objeto es un objeto de bytes. No está claro por qué los bytes se muestran como texto, tal vez esa sea otra 'sutileza' de Python, pero es confuso en este contexto. Gracias.
dotancohen
1
esto parece importar más con python 3.x que con python 2.x; usar requestsen python 3 en page.content da este error: if 'rss' in page.content:->TypeError: a bytes-like object is required, not 'str'
Marc Maxmeister