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 шт):

Автор решения: Universall

Как вариант можно сначала найти список, а в нём уже искать элементы и нужные ссылки. Скорее всего класс 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']}''')
→ Ссылка