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 でも同じ結果が得られます。