#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]
бы, но вам действительно следует подумать о том, как заставить этот скрипт работать для разных возвращаемых значений.