Как получить данные из таблицы с ID в BeautifulSoup?

Вопрос или проблема

Я пытаюсь получить данные из таблицы с id=’stats_standard’, используя библиотеки BeautifulSoup и requests, но я пробовал различные методы, такие как find и select, и по-прежнему получаю None или []. У кого-нибудь есть решение?

import requests 
from bs4 import BeautifulSoup

url="https://fbref.com/en/comps/9/2023-2024/stats/2023-2024-Premier-League-Stats" 

page = requests.get(url) 

soup = BeautifulSoup(page.text, 'html.parser')  

table = soup.find('table', id='stats_standard')
print(table) # None

Я хочу получить данные из таблицы.

По крайней мере, одна из таблиц на этой странице зависит от JavaScript для своей динамической сборки.

BeautifulSoup в вашем коде парсит документ, не учитывая, что может делать JavaScript.

Вы можете использовать selenium для этого.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions

URL = "https://fbref.com/en/comps/9/2023-2024/stats/2023-2024-Premier-League-Stats"

if __name__ == "__main__":
    options = ChromeOptions()
    options.add_argument("--headless=new")
    with webdriver.Chrome(options) as driver:
        driver.get(URL)
        wait = WebDriverWait(driver, 5)
        selector = (By.ID, "stats_standard")
        table = wait.until(EC.presence_of_element_located(selector))

Ответ или решение

Чтобы получить данные из таблицы с идентификатором stats_standard на веб-странице, использующей JavaScript для динамической генерации содержимого, вы можете использовать библиотеку Selenium, так как BeautifulSoup не сможет извлечь данные, которые загружаются с помощью JavaScript.

Вот шаги, которые необходимо выполнить, чтобы успешно получить данные из нужной таблицы:

  1. Установите необходимые библиотеки, если вы этого еще не сделали. Для этого выполните следующие команды в вашем терминале:

    pip install selenium
    pip install webdriver-manager
  2. Используйте следующий код для получения данных из таблицы:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup

URL = "https://fbref.com/en/comps/9/2023-2024/stats/2023-2024-Premier-League-Stats"

# Инициализация драйвера Chrome
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")  # Зависит от вашего предпочтения, чтобы не открывать интерфейс браузера
service = Service(ChromeDriverManager().install())

with webdriver.Chrome(service=service, options=options) as driver:
    driver.get(URL)

    # Ожидание загруженности таблицы
    wait = WebDriverWait(driver, 10)
    table = wait.until(EC.presence_of_element_located((By.ID, "stats_standard")))

    # Получение HTML-кода таблицы и передача его в BeautifulSoup
    soup = BeautifulSoup(table.get_attribute('outerHTML'), 'html.parser')

    # Теперь вы можете извлечь данные из таблицы
    rows = soup.find_all('tr')  # Получим все строки таблицы
    for row in rows:
        # Получение данных из каждой ячейки (столбца)
        columns = row.find_all('td')  # Ищем ячейки в строке
        data = [col.text.strip() for col in columns]  # Извлекаем текст
        if data:  # Проверяем, чтобы избежать пустых строк
            print(data)

Пояснения к коду:

  • Мы используем Selenium для автоматизации браузера, что позволяет нам взаимодействовать с веб-страницей, включая те элементы, которые загружаются динамически с помощью JavaScript.
  • WebDriverWait используется для ожидания загрузки элемента, чтобы убедиться, что таблица готова для извлечения.
  • После получения HTML-кода таблицы мы используем BeautifulSoup для извлечения данных. Мы находим все строки таблицы (<tr>) и затем извлекаем данные из каждой ячейки (<td>).
  • Код возвращает строки данных из таблицы в виде списка, что позволяет вам легко работать с ними.

Этот подход должен решить вашу задачу извлечения данных из таблицы на указанной веб-странице.

Оцените материал
Добавить комментарий

Капча загружается...