Вопрос или проблема
Я пытаюсь получить данные из таблицы с 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.
Вот шаги, которые необходимо выполнить, чтобы успешно получить данные из нужной таблицы:
-
Установите необходимые библиотеки, если вы этого еще не сделали. Для этого выполните следующие команды в вашем терминале:
pip install selenium pip install webdriver-manager
- Используйте следующий код для получения данных из таблицы:
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>
). - Код возвращает строки данных из таблицы в виде списка, что позволяет вам легко работать с ними.
Этот подход должен решить вашу задачу извлечения данных из таблицы на указанной веб-странице.