BeautifulSoup - не могу найти тег по имени класса
Есть сайт, содержащий список шаблонов документов. Надо его распарсить.
Пишу простейшую программу:
# Библиотеки для скрапинга
from bs4 import BeautifulSoup
import requests
# Начальный URL
url = 'https://uristhome.ru/document'
# Делаем запрос и получаем html
html_text = requests.get(url).text
# Парсим HTML в дерево тегов
soup = BeautifulSoup(html_text, 'lxml')
# Ищем строки таблицы
table_rows = soup.findAll('li')
#table_rows = soup.findAll(class_="ln-а")
#table_rows = soup.findAll('li', attrs={'class':'ln-a'})
print(f"Найдено {len(table_rows)} строк в таблице")
То, что написано после # Ищем строки таблицы (это строки 15-18) должно, по идее, выбирать те теги li, которые меня интересуют. Но получается, что ничего, кроме самого простого варианта, не работает.
Если раскомментровать строку 15, то поиск по имени тега отработает и выдасться:
Найдено 4049 строк в таблице
Однако мне нужна более точная выборка. А три оставшиеся варианты дают пустой результат:
Найдено 0 строк в таблице
Делаю всё, вроде бы, как в разных примерах, но ничего не получается. В чём может быть проблема?
Ответы (2 шт):
Как вариант можно сначала найти список, а в нём уже искать элементы и нужные ссылки. Скорее всего класс ln-а подставляется с помощью JS во время загрузки страницы, по этому парсер не может ничего найти (так как он скачал только html). Для полной прогрузки страницы можно использовать selenium.
soup = BeautifulSoup(html_text, 'html.parser')
# Ищем список
list_ = soup.find("ul", class_="y_articles-document-list")
# Ищем элементы списка
list_elements = list_.findAll("li")
# Поиск по всему списку
links_1 = list_.findAll("a", class_="rubr")
# Поиск по элементам списка
links_2 = [element.find("a", class_="rubr") for element in list_elements]
# Получение текста и ссылок
data = [{"text": link.text, "url": link.get("href")} for link in links_2]
print(data)
Пример с selenium
import os
import time
from bs4 import BeautifulSoup
from selenium import webdriver # pip install selenium
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager # pip install webdriver-manager
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver: # Открываем хром
driver.get("https://uristhome.ru/document") # Открываем страницу
time.sleep(5) # Время на прогрузку страницы
soup = BeautifulSoup(driver.page_source, 'html.parser') # Получаем готовый html и парсим его
list_ = soup.find("ul", class_="y_articles-document-list")
list_elements = list_.findAll("li", class_="ln-а")
# links_1 = list_.findAll("a", class_="rubr")
# links_2 = [element.find("a", class_="rubr") for element in list_elements]
# data = [{"text": link.text, "url": link.get("href")} for link in links_1]
table_rows = soup.findAll('a', class_="rubr")
for i in table_rows:
print(i.text)
print(f'''https://uristhome.ru{i['href']}''')