首页 > 解决方案 > 处理导致属性错误的表达式的最佳方法:循环期间的“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

标签: pythonbeautifulsoup

解决方案


findNone如果没有符合条件的元素则返回。然后,当您尝试调用.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...

推荐阅读