【问题标题】:Python. AttributeError: 'NoneType' object has no attribute 'startswith'Python。 AttributeError:“NoneType”对象没有属性“startswith”
【发布时间】:2017-10-05 23:43:51
【问题描述】:

为什么这段代码不起作用并给出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'

【问题讨论】:

    标签: python-2.7 powershell lambda web-scraping attributeerror


    【解决方案1】:

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

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

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

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

    【讨论】:

    • PEP008 表示与None 的比较应该写成if foo is None,而不是if foo。我意识到 OP 的代码在这个意义上也是“不正确的”,但如果提出建议,最好推荐“合规”的代码。恕我直言。
    • SiHa,我试图解释 OP 的 and 在做什么,因为他显然不明白这一点:这是他问题的重点。您当然是对的,但是更改比较会使解释混乱。
    • 感谢您的解释,顺便说一句,您推荐的代码是否有其他替代方法与此目的相同?
    • @garjted:没有理由不使用SiHa 的lambda job: job.startswith('Internship') if job is not None else False 提案。如果你喜欢这个解释,请接受它作为你问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2018-03-17
    • 2019-01-10
    • 2013-08-06
    相关资源
    最近更新 更多