Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘text’ BeautifulSoup

#python #beautifulsoup #jupyter-notebook

Вопрос:

 links = ['https://www.cnnindonesia.com/tv/20211101202542-407-715220/video-20-november-tiongkok-vaksinasi-anak-usia-3-11-tahun',   'https://www.cnnindonesia.com/nasional/20211101192825-32-715200/demokrat-sindir-menteri-jokowi-jadi-marketing-bisnis-pcr',   'https://www.cnnindonesia.com/nasional/20211101210153-25-715231/indonesia-distribusikan-2355-juta-dosis-vaksin-sepanjang-2021']   titles = [] news_content = [] dates = []    for link in links:  response = requests.get(link)  soup_link = bs(response.text, 'lxml')  cont_dtl = soup_link.find_all('div', class_='content_detail')  for cont in cont_dtl:  news_title = cont.find('h1', class_='title').text.strip()  titles.append(news_title)  date_upload = cont.find('div', class_='date').text.strip()  dates.append(date_upload)  find_p = cont.find_all('p')  list_paragraphs = []  for p in range(len(find_p)):  paragraph = find_p[p].get_text()  list_paragraphs.append(paragraph)  final_text = " ".join(list_paragraphs)  news_content.append(final_text)  

когда я попытался изменить метод выбора css, результат все равно был тот же вывод = Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘текст’

Ответ №1:

Я не знаю, в какой строке вы получаете «AttributeError: ‘NoneType'», Но иногда bs4 не получает ни одного, если есть еще div, или вы ищете что-то, в чем нет текста внутри, или просто не нашли div/h1 с этим классом. Проверьте,есть ли в каждом div, h1 текст внутри и есть ли класс, который вы упомянули. Я лично делаю это так(я добавляю это в каждую «находку», где у меня есть проблема с типом «Нет»):

 if cont.find('div', class_='date') == None:   pass else:  date_upload = cont.find('div', class_='date').text.strip()  

Интересно, что ваш код отлично работает на моем python 😀 Но попробуйте то, что я сказал

Ответ №2:

Как упоминал другой, он работает, и ошибки не возникает. Чтобы избежать таких ошибок в случае, если их не element было, вы можете получить текст, просто проверив, как:

 title = cont.h1.get_text(strip=True) if cont.h1 else 'no title'  

Пример

 from bs4 import BeautifulSoup import requests  data = []  links = ['https://www.cnnindonesia.com/tv/20211101202542-407-715220/video-20-november-tiongkok-vaksinasi-anak-usia-3-11-tahun',   'https://www.cnnindonesia.com/nasional/20211101192825-32-715200/demokrat-sindir-menteri-jokowi-jadi-marketing-bisnis-pcr',   'https://www.cnnindonesia.com/nasional/20211101210153-25-715231/indonesia-distribusikan-2355-juta-dosis-vaksin-sepanjang-2021']  for link in links:  url = requests.get(link)  soup = BeautifulSoup(url.text, 'lxml')  cont = soup.find('div', class_='content_detail')  title = cont.h1.get_text(strip=True) if cont.h1 else 'no title'  date = cont.find('div', class_='date').text.strip() if cont.find('div', class_='date') else 'no date'  content = ' '.join([p.get_text(strip=True) for p in cont.select('p')]) if cont.p else 'no content'    data.append({  'title':title,  'date':date,  'content':content  })     data  

Подсказка: Не занимайтесь этим отдельными списками, используйте диктанты.