リクエストからの応答に文が含まれているかどうかを確認しようとしています。
import requests
r = requests.get('https://www.eventbrite.co.uk/o/piers-test-16613670281')
text = 'Sorry, there are no upcoming events'
if text in r.content:
print('No Upcoming Events')
次のエラーが発生します:
TypeError: a bytes-like object is required, not 'str'
なぜこれが発生するのか、そして解決策はどうなるのか、私にはよくわかりません。
r.content
はbytes
オブジェクトですが、text
はstr
であるため、__contains__
(in
)チェックを実行できません。別の直接。
text
オブジェクトをバイト文字列として簡単に(再)定義できます。
text = b'Sorry, there are no upcoming events'
これで、if text in r.content:
を実行できます。
または、r.text
を使用してstr
表現を直接取得し、text
をそのまま(str
として)使用することもできます。
r.content
は、Python3.x。でbytes
のようなオブジェクトを返します。確認するには、次のようにします。
>>> type(r.content)
<class 'bytes'>
問題を解決する方法は複数あります。例えば:
r.content
を文字列にデコードします:decode
を文字列に次のようにデコードできます:
>>> text in r.content.decode()
False
r.content
をutf-8
文字列に次のように変換します。
>>> text in str(r.content, 'utf-8')
False
text
を定義してをバイト文字列として検索します。例えば:
text = b'Sorry, there are no upcoming events'
# ^ note the `b` here
これで、r.content
とともに次のように使用できます。
>>> text in r.content
False
r.text
の代わりに r.content
を使用して、文字列を検索します。 document が示唆するように:
r.text
にアクセスすると、リクエストによって推測されたテキストエンコーディングが使用されます。
したがって、次のことを行うことができます。
>>> text in r.text
False
Requestsはbytesオブジェクトを返します。を実行する前に、それを文字列に変換する必要があります。
組み込み型に関するリファレンスは次のとおりです。そのうちの1つはバイトです https://docs.python.org/3/library/stdtypes.html
探しているコード行は次のようなものです。
if text in r.content.decode():
print('No upcoming events')
デフォルトでは、デコードはutf-8を想定していますが、必要に応じて別のエンコーディングを渡すことができます。