Jaka jest różnica między „treścią” a „tekstem”

122

Używam wspaniałej biblioteki Python Requests . Zauważyłem, że dobra dokumentacja zawiera wiele przykładów tego, jak coś zrobić bez wyjaśniania dlaczego . Na przykład, zarówno r.texti r.contentsą przedstawione jako przykłady w jaki sposób uzyskać odpowiedź serwera. Ale gdzie jest wyjaśnione, co robią te właściwości? Na przykład, kiedy wybrałbym jedną z nich? Widzę, że thar czasamir.text zwraca obiekt Unicode i przypuszczam, że byłaby różnica w odpowiedzi nietekstowej. Ale gdzie jest to wszystko udokumentowane? Zwróć uwagę, że powiązany dokument podaje:

Możesz również uzyskać dostęp do treści odpowiedzi w postaci bajtów, w przypadku żądań nietekstowych:

Ale potem pokazuje przykład odpowiedzi tekstowej! Mogę tylko przypuszczać, że powyższy cytat oznacza non-text responseszamiast tego powiedzieć non-text requests, ponieważ żądanie nietekstowe nie ma sensu w HTTP.

Krótko mówiąc, gdzie jest właściwa dokumentacja biblioteki, w przeciwieństwie do (doskonałego) samouczka na stronie Python Requests?

dotancohen
źródło

Odpowiedzi:

144

Interfejs deweloper ma więcej szczegółów:

r.textto treść odpowiedzi w formacie Unicode i r.contentjest to treść odpowiedzi w bajtach.

Gary Kerr
źródło
46
A kiedy byś wybrał jedną lub drugą?
multigoodverse
13
@multigoodverse: Prawdopodobnie r.textbyłby preferowany w przypadku odpowiedzi tekstowych, takich jak dokument HTML lub XML, i r.contentbyłby preferowany w przypadku „binarnych” typów plików, takich jak obraz lub plik PDF.
dotancohen,
5
@dotancohen HTML i XML używają deklaracji w danych do własnego dekodowania, więc powinny być zasilane surowym r.content, a nie ukrytym r.text.
tdelaney
Mówiąc bardziej ogólnie, pojedyncza odpowiedź może zawierać zagnieżdżoną lub wieloczęściową treść (np. Wiadomości e-mail z załącznikami), a każda część może być zakodowana na różne sposoby. Niemożliwe jest obsłużenie takich odpowiedzi bez dostępu do strumienia bajtów, ale jest to dalekie od typowego przypadku, w którym chcesz po prostu poprawnie zdekodować tekst Unicode.
holdenweb
Dlaczego interpreter Pythona wyświetla oba teksty r.texti r.contentjako teksty. Dlaczego nie wyświetlać r.contentjako tekst i r.textjako bity (jeśli tak jest z natury)?
Arnb
11

Z dokumentacji jasno wynika, że ​​r. Treść

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

 >>> r.content

Jeśli czytasz dalej w dół strony, dotyczy ona na przykład pliku obrazu

PyNEwbie
źródło
2
Dziękuję Ci. Teraz widzę mały fragment bpoprzedzający pierwszy przykład z tekstem „dla żądań nietekstowych”, co oznacza, że ​​obiekt jest obiektem bajtów. Nie jest jasne, dlaczego bajty są wyświetlane jako tekst, być może jest to kolejna „drobiazg” Pythona, ale w tym kontekście jest to mylące. Dzięki.
dotancohen
1
wydaje się, że ma to większe znaczenie w Pythonie 3.x niż w Pythonie 2.x; używanie requestsw pythonie 3 na stronie. zawartość powoduje następujący błąd: if 'rss' in page.content:->TypeError: a bytes-like object is required, not 'str'
Marc Maxmeister.