python - 处理导致属性错误的表达式的最佳方法:循环期间的“NoneType”
问题描述
在循环一个漂亮的汤对象时,有时一个标签存在于一个迭代中,但不存在于下一个迭代中。由于我之后还使用一串 .text 提取文本,因此我遇到了 AttributeError: 'NoneType' object has no attribute 'text' being raise。
我将所有这些结果分配给字典,并且当元素不存在时,我希望字典中的值是“无”。最好不要在任何东西上调用 .text 并稍后以某种方式解析存储在字典中的 HTML?
for review in reviews:
entry = {
'bnm' : review.find('p', {'class' : 'bnm-txt'}).text
'artist' : review.find('ul', {'class' : 'artist-links artist-list single-album-tombstone__artist-links'}),
'title' : review.find('h1', {'class' : 'single-album-tombstone__review-title'}).text,
'score' : review.find('span', {'class' : 'score'}).text,
'label' : review.find('li', {'class' : 'labels-list__item'}).text,
'year' : review.find('span', {'class' : 'single-album-tombstone__meta-year'}).text[3:],
'author' : review.find('a', {'class' : 'authors-detail__display-name'}).text,
'author_title' : review.find('span', {'class' : 'authors-detail__title'}),
'genre' : review.find('a', {'class' : 'genre-list__link'}).text,
'review_timestamp' : review.find('time', {'class' : 'pub-date'}).text,
'review_abstract' : review.find('div', {'class' : 'review-detail__abstract'}).text,
'review_text' : review.find('div', {'class' : 'clearfix flex-md'}).text
解决方案
find
None
如果没有符合条件的元素则返回。然后,当您尝试调用.text
结果时,它会因您看到的错误而失败。
一个想法可能是用一个处理这种情况的函数来包装它:
def safeFindText(elem, name, attrs):
temp = elem.find(name, attrs)
if temp:
return temp.text
return None
然后在循环中使用它:
for review in reviews:
entry = {
'bnm' : safeFindText(review, 'p', {'class' : 'bnm-txt'})
'artist' : safeFindText(review, 'ul', {'class' : 'artist-links artist-list single-album-tombstone__artist-links'}),
# etc...
推荐阅读
- database - 如何在已经存在的表中添加一列并在其中填写按 Oracle 服务器上的列排序的 ID?
- html - 如何通过CSS设置两层文字的外边框?
- python - 在 Python 中,如何将某些测试标记为仅在满足条件时执行
- javascript - 即使页脚是动态的,如何将页面限制在页脚所在的位置?
- javascript - 如何在没有 RPC 的情况下在 Javascript 中获取 Odoo 记录?
- xcode - 未找到 xcode 模块“file_picker”
- cakephp - Cakephp集成测试登录后我将如何发布请求?
- python - Solve.Ivp 返回中间变量
- typescript - Typescript,如何为接口字段定义自定义类型?
- python - 错误:'EOFError:输入不足'。我正在尝试读取泡菜文件以生成预测