web-dev-qa-db-ja.com

「typeError: 'str'ではなくバイトのようなオブジェクトが必要です」を発生させる "response.content"の文字列を確認してください

リクエストからの応答に文が含まれているかどうかを確認しようとしています。

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'

なぜこれが発生するのか、そして解決策はどうなるのか、私にはよくわかりません。

7
Piers Thomas

r.contentbytesオブジェクトですが、textstrであるため、__contains__in)チェックを実行できません。別の直接。

textオブジェクトをバイト文字列として簡単に(再)定義できます。

text = b'Sorry, there are no upcoming events'

これで、if text in r.content:を実行できます。

または、r.textを使用してstr表現を直接取得し、textをそのまま(strとして)使用することもできます。

7
heemayl

r.content は、Python3.x。でbytesのようなオブジェクトを返します。確認するには、次のようにします。

>>> type(r.content)
<class 'bytes'>

問題を解決する方法は複数あります。例えば:

  1. r.contentを文字列にデコードしますdecodeを文字列に次のようにデコードできます:

    >>> text in r.content.decode()
    False
    
  2. r.contentutf-8文字列に次のように変換します。

    >>> text in str(r.content, 'utf-8')
    False
    
  3. textを定義してをバイト文字列として検索します。例えば:

    text = b'Sorry, there are no upcoming events'
    #      ^  note the `b` here
    

    これで、r.contentとともに次のように使用できます。

    >>> text in r.content
    False
    
  4. r.textの代わりに r.contentを使用して、文字列を検索します。 document が示唆するように:

    r.textにアクセスすると、リクエストによって推測されたテキストエンコーディングが使用されます。

    したがって、次のことを行うことができます。

    >>> text in r.text
    False
    
8

代わりにこれを試してください:

if text in r.text:

r.text は返されるテキストコンテンツです。 r.content は返されるバイナリコンテンツです。

3
Robᵩ

Requestsはbytesオブジェクトを返します。を実行する前に、それを文字列に変換する必要があります。

組み込み型に関するリファレンスは次のとおりです。そのうちの1つはバイトです https://docs.python.org/3/library/stdtypes.html

探しているコード行は次のようなものです。

if text in r.content.decode():
  print('No upcoming events')

デフォルトでは、デコードはutf-8を想定していますが、必要に応じて別のエンコーディングを渡すことができます。

3
Steve