Селен не получает тело стола - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь получить таблицу, использующую селен, но сталкиваюсь со следующей проблемой. Когда я бегу:

stats_box = driver.find_element_by_xpath("//div[@class='mcStatsTab statsSection season-so-far wrapper col-12 active']//table")
stats_html = stats_box.get_attribute('outerHTML')
print(stats_html)

Все, что я получаю, это:

<table>
<thead>
"FULL HEAD IS HERE"
</thead>
<tbody class="matchCentreStatsContainer"></tbody>
</table>

Как видите, я получаю голову, но тело, которое является той частью, которая мне нужна, это опорожнить. Полный HTML на изображении ниже. Извините, что опубликовал изображение, но я не смог опубликовать HTML в удобочитаемом виде.

HTML здесь

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 16 апреля 2020

Я только предполагаю, что это то, что вы после. Это выглядит правильно?

import time
import pandas as pd
from selenium import webdriver

from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome('C:/chromedriver_win32/chromedriver.exe')
driver.get('https://www.premierleague.com/match/46608')

elem = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="mainContent"]/div/section/div[2]/div[2]/div[1]/div/div/ul/li[3]')))
elem.click()

time.sleep(5)

dfs = pd.read_html(driver.page_source)

for df in dfs:
    if len(df) > 10:
        print (df)
driver.close()

Вывод:

    Crystal Palace       Unnamed: 1  Everton
0             35.4     Possession %     64.6
1              2.0  Shots on target      3.0
2              6.0            Shots     10.0
3            467.0          Touches    722.0
4            268.0           Passes    500.0
5             21.0          Tackles     14.0
6             21.0       Clearances     18.0
7              6.0          Corners      2.0
8              4.0         Offsides      0.0
9              2.0     Yellow cards      1.0
10             0.0        Red cards      1.0
11            16.0   Fouls conceded     14.0

Объяснение .page_source и dfs частей:

Так что с Selenium, вы абсолютно можете разобрать страницу и извлечь нужные данные, используя исключительно селен. Я лично больше знаком с BeautifulSoup. driver.page_source просто извлекает источник html со страницы, которая открывается в вашем браузере Selenium. и что вы могли бы сделать, это передать это в beausitfulsoup с помощью soup = BeautifulSoup(driver.page_source, 'html.parser')

Однако, если я использую теги <table>, я не буду беспокоиться о BeautifulSoup (хотя нет ничего плохого в том, чтобы использовать его для анализа таблиц) , Но Pandas имеет функцию .read_html() (которая на самом деле использует BeautifulSoup под капотом) для анализа <table> тегов. Поэтому вместо того, чтобы кормить html в bs4, я вставил его в pandas с dfs = pd.read_html(driver.page_source)

, это будет возвращать список фреймов данных / таблиц для каждого тега <table>, который он анализирует в html , Поэтому после использования .read_html() достаточно просто извлечь правильную таблицу из списка возвращенных таблиц.

Затем вы можете манипулировать кадром данных по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...