Как я могу исправить эту ошибку атрибута ‘None Type’?

#python #web-scraping #attributeerror #nonetype

#python #соскабливание полотна #ошибка атрибута #нетипичный

Вопрос:

Я занят тем, что делаю учебник по python, и я занят тем, что просматриваю веб-страницы. Когда инструктор запускает программу, он не получает никаких ошибок, однако, когда я запускаю программу, я получаю ошибку атрибута. Учебное пособие было сделано в конце прошлого года, поэтому формат веб-сайта немного изменился. тем не менее, мне удалось обойти это. Я соскабливаю паутину forecast.weather.gov Самое странное, что я запустил аналогичную строку до этого, и она отлично сработала, так что я действительно в замешательстве! Вот код:

 import requests
from bs4 import BeautifulSoup

page = requests.get('https://forecast.weather.gov/MapClick.php?lat=34.05349000000007amp;lon=-118.24531999999999#.X8qd1NgzZPY')
soup = BeautifulSoup(page.content, 'html.parser')
week = soup.find(id="seven-day-forecast-body")
# print(week)

items = week.find_all(class_='forecast-tombstone')
#print(items)

print(items[1].find(class_='period-name').get_text())
print(items[1].find(class_='short-desc').get_text())
print(items[1].find(class_='temp').get_text())

period_names = [item.find(class_='period-name').get_text() for item in items]
short_descriptions = [item.find(class_='short-desc').get_text() for item in items]
temperature = [item.find(class_='temp').get_text() for item in items]
print(period_names)
print(short_descriptions)
print(temperature)
 

И это вывод:

 Overnight
Partly Cloudy
Low: 49 °F
Traceback (most recent call last):
  File "C:/Users/Bongi/PycharmProjects/Qazicourse/Web Scraping.py", line 18, in <module>
    temperature = [item.find(class_='temp').get_text() for item in items]
  File "C:/Users/Bongi/PycharmProjects/Qazicourse/Web Scraping.py", line 18, in <listcomp>
    temperature = [item.find(class_='temp').get_text() for item in items]
AttributeError: 'NoneType' object has no attribute 'get_text'

Process finished with exit code 1
 

Обратите внимание, что в этой строке есть только ошибка,

 temperature = [item.find(class_='temp').get_text() for item in items]
 

и только не этот, print(items[1].find(class_='temp').get_text())

Я полный новичок в программировании (не только на python), поэтому прошу прощения, если набрал слишком много кода. Любые советы или помощь будут высоко оценены!

Комментарии:

1. Я думаю, что с BeautifulSoup этим вы должны проверить возврат, find() потому что он может вернуться None в любое время.

2. при повторной итерации items item.find(class_='temp') возвращается None значение в элементах.

3. Вы перебираете все элементы с [item..... for item in items] помощью и здесь: print(items[1].find(class_='temp').get_text()) вы берете только второй элемент из списка. Может случиться так, что один из элементов в массиве items не содержит ‘temp’.

4. Быстрое исправление было temperature = [item.find(class_='temp').get_text() if item.find(class_='temp') else "has no text" for item in items] бы, но вам действительно следует подумать о том, как заставить этот скрипт работать для разных возвращаемых значений.