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


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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.