Парсер на beautifulSoap выводит только первый результат и не продолжает итерации
Пишу парсер для сайта анекдотов https://nekdo.ru/. Когда пытаюсь спарсить левый список тем этим же кодом, всё работает. Но когда пытаюсь спарсить чисто для примера тексты с первой страницы, парсер выдает только самый первый текст и не идет дальше, хотя items вроде как имеет нужный формат.

import cards as cards
import requests
from bs4 import BeautifulSoup
import lxml
import sqlite3
url = 'https://nekdo.ru/'
base_url = 'https://nekdo.ru'
HEADERS = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
}
def get_html(url, params=""):
r = requests.get(url, headers=HEADERS, params=params)
return r
def get_content(html):
soup = BeautifulSoup(html, "lxml")
items = soup.find_all("div", class_="content")
arr = []
print(items)
for item in items:
arr.append(
{
"text": item.find("div", class_="text").get_text()
#"category": item.find("a").get("title")
}
)
print(arr)
html = get_html(url)
get_content(html.text)
Ответы (1 шт):
Если бы вывели количество элементов, то заметили бы что-то идет не так:
print(len(items))
# 1
Поэтому, у вас тут идет 1 итерация:
for item in items:
И добавляете первый элемент из "div", class_="content":
item.find("div", class_="text").get_text()
Т.е. вам нужно сначала find, чтобы найти "div", class_="content", а у него вызывать и итерировать по find_all, чтобы искать "div", class_="text"
Но мне больше нравится использовать css-селекторы, поэтому пример с select:
def get_content(html):
soup = BeautifulSoup(html, "html.parser")
arr = []
for item in soup.select('.content .text'):
arr.append({
"text": item.get_text()
})
print(len(arr), arr)
Результат:
30 [{'text': 'Приходит мужик в аптеку и жалуется:- У Вас презервативы бракованные!- А в чем дело?- Да какой не надену, все гнутся!'}, {'text': 'Фантазия человека настолько безгранична, что ее хватило только на четыре пальца из пяти.'}, ...
ЗЫ.
В питоне есть парсер из коробки - html.parser:
BeautifulSoup(html, "html.parser")