1

requests次のコードを使用して、およびBeautifulSoupライブラリを使用して任意の Web ページを解析しようとしています。

try:
    response = requests.get(url)
except Exception as error:
    return False

if response.encoding == None:
    soup = bs4.BeautifulSoup(response.text) # This is line 809
else:
    soup = bs4.BeautifulSoup(response.text, from_encoding=response.encoding)

ほとんどの Web ページでは、これで問題なく動作します。ただし、一部の任意のページ (<1%) では、次のクラッシュが発生します。

Traceback (most recent call last):
  File "/home/dotancohen/code/parser.py", line 155, in has_css
    soup = bs4.BeautifulSoup(response.text)
  File "/usr/lib/python3/dist-packages/requests/models.py", line 809, in text
    content = str(self.content, encoding, errors='replace')
  TypeError: str() argument 2 must be str, not None

参考までに、これは requests ライブラリの関連メソッドです。

@property
def text(self):
    """Content of the response, in unicode.

    if Response.encoding is None and chardet module is available, encoding
    will be guessed.
    """

    # Try charset from content-type
    content = None
    encoding = self.encoding

    # Fallback to auto-detected encoding.
    if self.encoding is None:
        if chardet is not None:
            encoding = chardet.detect(self.content)['encoding']

    # Decode unicode from given encoding.
    try:
        content = str(self.content, encoding, errors='replace') # This is line 809
    except LookupError:
        # A LookupError is raised if the encoding was not found which could
        # indicate a misspelling or similar mistake.
        #
        # So we try blindly encoding.
        content = str(self.content, errors='replace')

    return content

ご覧のとおり、このエラーがスローされたときにエンコーディングを渡していません。ライブラリを誤って使用する方法と、このエラーを防ぐにはどうすればよいですか? これは Python 3.2.3 ですが、Python 2 でも同じ結果が得られます。

4

1 に答える 1