#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
Подсказка: Не занимайтесь этим отдельными списками, используйте диктанты.