BeautifulSoup Exception середина цикла очистки файла HTML - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь удалить локальную папку HTML-файлов для пары переменных, но получаю исключение примерно в середине цикла.Исключение составляет AttributeError: 'NoneType' object has no attribute 'contents.На самом деле это не .contents Я посмотрел на файл, к которому он привязан, и он структурирован точно так же, как и другие файлы.Если вы удалите .contents, вы просто вызовете то же исключение, но с функцией find().Кто-нибудь знает, почему это происходит?Опять многие файлы обрабатываются без проблем.Мой код ниже:

df_list = []
folder = 'rt_html'
for movie_html in os.listdir(folder):
    with open(os.path.join(folder, movie_html)) as file:
        soup = BeautifulSoup(file)
        title = soup.find('title').contents[0][:-len(' - Rotten Tomatoes')]
        audience_score = soup.find('div', class_ = 'audience-score meter').find('span').contents[0][:-1]
        num_audience_ratings = soup.find('div', class_ = 'audience-info hidden-xs superPageFontColor')
        num_audience_ratings = num_audience_ratings.find_all('div') [1].contents[2].strip().replace(',', '')


        # print(num_audience_ratings)
        # break

        df_list.append({'title': title,
                        'audience_score': int(audience_score),
                        'number_of_audience_ratings': int(num_audience_ratings)})
df = pd.DataFrame(df_list, columns = ['title', 'audience_score', 'number_of_audience_ratings'])

1 Ответ

0 голосов
/ 27 января 2019

Я предполагаю, что некоторые файлы не имеют атрибутов, которые вы ищете.

Например.

 audience_score = soup.find('div', class_ = 'audience-score meter').find('span').contents[0][:-1]

Если нет div с классом audience-score meter тогда soup.find('div', class_ = 'audience-score meter') вернет None.Любое последующее find или contents в этом случае приведет к AttributeError

. Решение будет заключаться в том, чтобы попытаться, за исключением этого, и установить значение в пустую строку.

try:    
    audience_score = soup.find('div', class_ = 'audience-score meter').find('span').contents[0][:-1]
except AttributeError:
    audience_score=""  

Сделайте то же самое для title и num_audience_ratings (оба задания)

...