#python #beautifulsoup #jupyter-notebook
Вопрос:
я получил ошибку при получении значения href, и в нем говорится: «Объект набора результатов не имеет атрибута «find_all». Вероятно, вы рассматриваете список элементов как один элемент. Вы вызывали find_all (), когда хотели вызвать find ()?», но когда я меняю «find()» в своем коде значения get href, он говорит: «У объекта набора результатов нет атрибута «найти». Вероятно, вы рассматриваете список элементов как один элемент. Вы вызывали функцию find_all (), когда собирались вызвать функцию find()?» вот мой код:
titles = [] dates = [] links = [] page = 1 while (page lt;= 60): url = requests.get(f"http://detik.com/search/searchall?query=covidamp;siteid=2amp;sortby=timeamp;page={page}") soup = bs(url.text, 'lxml') container = soup.find_all('div', class_='container content') for l_media in container: media_cont = l_media.find_all('div', class_='list media_rows list-berita') for article in media_cont: article_cont = article.find_all('article') for title in article_cont: news_title = title.find('h2', class_='title') titles.append(news_title.text.strip()) for date in article_cont: news_date = date.find('span', class_='date') dates.append(news_date.text.strip()) for a_tag in article_cont.find('a'): link = a_tag['href'] links.append(link) page = 1
Ответ №1:
Нет необходимости использовать все эти циклы, взгляните на альтернативный подход.
Пример
from bs4 import BeautifulSoup import requests data = [] page = 1 url = requests.get(f"http://detik.com/search/searchall?query=covidamp;siteid=2amp;sortby=timeamp;page={page}") soup = BeautifulSoup(url.text, 'lxml') while (page lt;= 10): for article in soup.select('div.list-berita article'): news_title = article.find('h2', class_='title').text news_date = article.find('span', class_='date').contents[1] link = article.find('a')['href'] data.append({ 'title':news_title, 'date':news_date, 'link':link }) page = 1 data
Комментарии:
1. что означает .содержание[1]?
2. Дочерние элементы тега доступны в списке, который называется
.contents
«Естьlt;spangt;
как первый дочерний элемент», а текст-как второй. Вы также можете пойти.get_text('|', strip=True).split('|')[1]
только на свидание