Python。AttributeError:“NoneType”对象没有属性“startswith”

jte*_*d95 7 powershell lambda attributeerror web-scraping python-2.7

为什么这段代码不起作用并给出 AttributeError ?

internship = parser.find_all('a', attrs = {'title': lambda job: job.startswith('Internship')})
Run Code Online (Sandbox Code Playgroud)

虽然这个有效:

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

这是我从第一个代码中得到的错误:

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'
Run Code Online (Sandbox Code Playgroud)

Boa*_*les 3

在第一行代码中,您收到属性错误,因为代码假设job包含一个字符串,该字符串具有方法startswith(),但它不包含字符串,它包含None

在第二行代码中,您没有收到属性错误,因为代码正在测试是否job包含None,然后再调用startswith()它。另一种(不完全相同但可以说更好)的表达方式

lambda job: job and job.startswith('Internship')
Run Code Online (Sandbox Code Playgroud)

lambda job: job.startswith('Internship') if job else False
Run Code Online (Sandbox Code Playgroud)