#python #web-scraping #beautifulsoup
#python #очистка веб-страниц #beautifulsoup
Вопрос:
Я пытаюсь очистить результаты теннисных матчей с этого веб-сайта, используя BeautifulSoup на Python. Я много чего перепробовал, но всегда получаю обратно пустой список. Есть ли очевидная ошибка, которую я совершаю? На веб-сайте есть несколько экземпляров этого класса, когда я его проверяю, но, похоже, он его не находит.
import requests
from bs4 import BeautifulSoup
url = 'https://www.flashscore.com/tennis/atp-singles/french-open/results/'
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')
match_container = soup.find_all('div', class_='event__match event__match--static event__match--last event__match--twoLine')
print(match_container)
Комментарии:
1. Можете ли вы попробовать это с selenium?
Ответ №1:
Таблица результатов загружается через javascript, и BeautifulSoup не находит ее, потому что она еще не загружена на момент синтаксического анализа. Чтобы решить эту проблему, вам нужно будет использовать selenium. Вот ссылка для chromedriver.
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
wd = webdriver.Chrome('<PATH_TO_CHROMEDRIVER>',chrome_options=chrome_options)
# load page via selenium
wd.get("https://www.flashscore.com/tennis/atp-singles/french-open/results/")
# wait 5 seconds until results table will be loaded
table = WebDriverWait(wd, 5).until(EC.presence_of_element_located((By.ID, 'live-table')))
# parse content of the grid
soup = BeautifulSoup(table.get_attribute('innerHTML'), 'lxml')
# access grid cells, your logic should be here
for tag in soup.find_all('div', class_='event__match event__match--static event__match--last event__match--twoLine'):
print(tag)
Ответ №2:
Данные о результатах загружаются на страницу динамически, и вы получаете только начальный HTML-код с запросами.
Как предложил пользователь70 в комментариях, способ сделать это — сначала использовать такой инструмент, как Selenium, чтобы получить весь динамический контент, который вы видите в инструменте проверки вашего веб-браузера.
В Интернете есть несколько руководств, показывающих, как это работает — возможно, вы могли бы начать с этого: