1. ホーム
  2. python-2.7

[解決済み] Pythonです。AttributeError: 'NoneType' オブジェクトには 'startswith' 属性がありません。

2022-02-04 21:47:53

質問

なぜこのコードは動作せず、AttributeErrorが発生するのでしょうか?

internship = parser.find_all('a', attrs = {'title': lambda job: job.startswith('Internship')})

が、こちらは動作します。

internship = parser.find_all('a', attrs = {'title': lambda job: job and job.startswith('Internship')})

これは、最初のコードで出たエラーです。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\bs4\element.py", line 1299, in find_all
   return self._find_all(name, attrs, text, limit, generator, **kwargs)
  File "C:\Python27\lib\site-packages\bs4\element.py", line 549, in _find_all
   found = strainer.search(i)
  File "C:\Python27\lib\site-packages\bs4\element.py", line 1690, in search
   found = self.search_tag(markup)
  File "C:\Python27\lib\site-packages\bs4\element.py", line 1662, in search_tag
    if not self._matches(attr_value, match_against):
  File "C:\Python27\lib\site-packages\bs4\element.py", line 1722, in _matches
    return match_against(markup)
  File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'startswith'

解決方法は?

1行目のコードで、属性エラーが発生しているのは、このコードが job は文字列を含んでおり、その文字列はメソッド startswith() を含むが、文字列を含まない。 None .

2行目のコードでは、属性エラーは発生しません。 job には None を呼び出す前に startswith() を追加しました。もう一つの(全く同等ではないが、間違いなくより良い)表現方法として

lambda job: job and job.startswith('Internship')

lambda job: job.startswith('Internship') if job else False