Qual é a diferença entre 'conteúdo' e 'texto'

122

Estou usando a excelente biblioteca de solicitações do Python . Percebo que a boa documentação tem muitos exemplos de como fazer algo sem explicar o porquê . Por exemplo, r.texte r.contentsão mostrados como exemplos de como obter a resposta do servidor. Mas onde é explicado o que essas propriedades fazem? Por exemplo, quando eu escolheria um em vez do outro? Vejo que às vezesr.text retorna um objeto Unicode e suponho que haveria uma diferença para uma resposta não textual. Mas onde tudo isso está documentado? Observe que o documento vinculado afirma:

Você também pode acessar o corpo da resposta como bytes, para solicitações não textuais:

Mas, em seguida, mostra um exemplo de uma resposta de texto! Só posso supor que a citação acima significa dizer em non-text responsesvez de non-text requests, já que uma solicitação sem texto não faz sentido em HTTP.

Resumindo, onde está a documentação adequada da biblioteca, ao contrário do (excelente) tutorial no site de solicitações do Python?

dotancohen
fonte

Respostas:

144

A interface do desenvolvedor tem mais detalhes:

r.texté o conteúdo da resposta em Unicode e r.contenté o conteúdo da resposta em bytes.

Gary Kerr
fonte
46
E quando você escolheria um ou outro?
multigoodverse de
13
@multigoodverse: Presumivelmente, r.textseria preferido para respostas textuais, como um documento HTML ou XML, e r.contentseria preferido para tipos de arquivos "binários", como uma imagem ou arquivo PDF.
dotancohen
5
@dotancohen HTML e XML usam declarações nos dados para fazer sua própria decodificação e, portanto, devem ser alimentados com o conteúdo bruto r.content, não com o encoberto r.text.
tdelaney
De forma mais geral, uma única resposta pode conter conteúdo aninhado ou multiparte (como mensagens de e-mail com anexos) e cada parte pode ser codificada de maneiras diferentes. É impossível lidar com essas respostas sem acesso ao fluxo de bytes, mas está muito longe do caso comum, onde você quer apenas texto Unicode decodificado corretamente.
holdenweb
Por que o interpretador python mostra ambos r.texte r.contentcomo textos. Por que não mostrar r.contentcomo texto e r.textcomo bits (se isso é o que é inerentemente)?
Arnb de
11

Parece claro na documentação que r.content

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

 >>> r.content

Se você ler mais adiante na página, ela aborda, por exemplo, um arquivo de imagem

PyNEwbie
fonte
2
Obrigado. Agora vejo o pequeno que bprecede o primeiro exemplo com o texto "para solicitações não textuais", o que significa que o objeto é um objeto de bytes. Não está claro porque os bytes estão sendo exibidos como texto, talvez essa seja outra 'sutileza' do Python, mas é confuso neste contexto. Obrigado.
dotancohen
1
isso parece importar mais com o python 3.x do que com o python 2.x; usar requestsem python 3 em page.content dá este erro: if 'rss' in page.content:->TypeError: a bytes-like object is required, not 'str'
Marc Maxmeister