Check for string in "response.content" raising "TypeError: a bytes-like object is required, not 'str'"
r.content
is a bytes
object but text
is str
, so you can't do the __contains__
(in
) check on another directly.
You can easily (re-)define the text
object to be a bytestring:
text = b'Sorry, there are no upcoming events'
Now, you can do if text in r.content:
.
or you can use r.text
to get the str
representation directly, and use text
as-is (as str
).
r.content
returns a bytes
like object in Python 3.x. To check, do:
>>> type(r.content)
<class 'bytes'>
There are multiple ways to fix your issue. For example:
Decode
r.content
to string: You candecode
it to string as:>>> text in r.content.decode() False
Convert
r.content
toutf-8
string as:>>> text in str(r.content, 'utf-8') False
Define your
text
to search as a byte-string. For example:text = b'Sorry, there are no upcoming events' # ^ note the `b` here
Now you may simply use it with
r.content
as:>>> text in r.content False
Use
r.text
instead ofr.content
to search for the string, which as the document suggests:The text encoding guessed by Requests is used when you access
r.text
.Hence you may just do:
>>> text in r.text False
Try this instead:
if text in r.text:
r.text
is the textual content that is returned. r.content
is the binary content that is returned.