Qual è la differenza tra "contenuto" e "testo"


122

Sto usando la fantastica libreria Python Requests . Noto che la bella documentazione contiene molti esempi di come fare qualcosa senza spiegare il perché . Ad esempio, entrambi r.texte r.contentvengono mostrati come esempi di come ottenere la risposta del server. Ma dove viene spiegato cosa fanno queste proprietà? Ad esempio, quando dovrei scegliere uno rispetto all'altro? Vedo Thar r.textrestituisce un oggetto unicode a volte , e suppongo che ci sarebbe una differenza per una risposta non di testo. Ma dove è documentato tutto questo? Nota che il documento collegato afferma:

È inoltre possibile accedere al corpo della risposta come byte, per le richieste non di testo:

Ma poi continua a mostrare un esempio di una risposta di testo! Posso solo supporre che la citazione sopra significhi dire non-text responsesinvece di non-text requests, poiché una richiesta non di testo non ha senso in HTTP.

In breve, dov'è la corretta documentazione della libreria, a differenza del (ottimo) tutorial sul sito Python Requests?


Risposte:


144

L' interfaccia per sviluppatori ha più dettagli:

r.textè il contenuto della risposta in Unicode ed r.contentè il contenuto della risposta in byte.


46
E quando sceglieresti l'uno o l'altro?
multigoodverse

13
@multigoodverse: presumibilmente r.textsarebbe preferito per le risposte testuali, come un documento HTML o XML, e r.contentsarebbe preferito per i tipi di file "binari", come un'immagine o un file PDF.
dotancohen

5
@dotancohen HTML e XML utilizzano dichiarazioni nei dati per eseguire la propria decodifica e quindi dovrebbero essere alimentati con il grezzo r.content, non con il nascosto r.text.
tdelaney

Più in generale, una singola risposta potrebbe contenere contenuto nidificato o in più parti (come messaggi di posta elettronica con allegati) e ciascuna parte potrebbe essere codificata in modi diversi. È impossibile gestire tali risposte senza accesso al flusso di byte, ma è molto lontano dal caso comune, in cui si desidera solo un testo Unicode correttamente decodificato.
holdenweb

Perché l'interprete Python mostra sia r.texte r.contentcome testi. Perché non mostrare r.contentcome testo e r.textcome bit (se è quello che è intrinsecamente)?
Arnb

11

Sembra chiaro dalla documentazione che r.content

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

 >>> r.content

Se leggi più in basso la pagina indirizza ad esempio un file immagine


2
Grazie. Vedo ora il piccolo che bprecede il primo esempio con il testo "per richieste non di testo", il che significa che l'oggetto è un oggetto byte. Non è chiaro il motivo per cui i byte vengono visualizzati come testo, forse questa è un'altra "delicatezza" di Python, ma è fonte di confusione in questo contesto. Grazie.
dotancohen

1
questo sembra avere più importanza con python 3.x che con python 2.x; utilizzando requestsin Python 3 su page.content dà questo errore: if 'rss' in page.content:->TypeError: a bytes-like object is required, not 'str'
Marc Maxmeister
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.