Webscraping jTable со скрытыми столбцами? - PullRequest
0 голосов
/ 18 января 2019

Я сейчас пытаюсь настроить веб-браузер в Python для следующей веб-страницы:

https://understat.com/team/Juventus/2018

специально для 'team-Players jTable'

У меня естьудалось успешно очистить таблицу с помощью BeautifulSoup и selenium, но есть скрытые столбцы (доступные через всплывающее окно параметров), которые я не могу инициализировать и включить в мой анализ.

Кто-нибудь знает, как это изменить?

import urllib.request
from bs4 import BeautifulSoup
import lxml
import re
import requests
from selenium import webdriver
import pandas as pd
import re
import random
import datetime


base_url = 'https://understat.com/team/Juventus/2018'
url = base_url
data = requests.get(url)
html = data.content
soup = BeautifulSoup(html, 'lxml')
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome('/Users/kylecaron/Desktop/souptest/chromedriver',options=options)
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'lxml')

headers = soup.find('div', attrs={'class':'players jTable'}).find('table').find_all('th',attrs={'class':'sort'})

headers_list = [header.get_text(strip=True) for header in headers]

body = soup.find('div', attrs={'class':'players jTable'}).table.tbody


all_rows_list = []
for tr in body.find_all('tr'):
    row = tr.find_all('td')
    current_row = []
    for item in row:
        current_row.append(item.get_text(strip=True))
    all_rows_list.append(current_row)

headers_list = ['№', 'Player', 'Positions', 'Apps', 'Min', 'G', 'A', 'Sh90', 'KP90', 'xG', 'xA', 'xG90', 'xA90']

xg_df = pd.DataFrame(all_rows_list, columns=headers_list)

Если вы переходите на веб-сайт, есть скрытые столбцы таблицы, такие как «XGChain».Я хочу, чтобы все эти скрытые элементы были удалены, но у меня возникли проблемы с этим.

Best, Kyle

1 Ответ

0 голосов
/ 19 января 2019

Вот, пожалуйста. Вы все еще можете использовать BeautifulSoup для перебора тегов tr и td, но я всегда нахожу панд гораздо проще получать таблицы, так как это делает работу за вас.

from selenium import webdriver
import pandas as pd

url = 'https://understat.com/team/Juventus/2018'

driver = webdriver.Chrome()
driver.get(url)

# Click the Options Button
driver.find_element_by_xpath('//*[@id="team-players"]/div[1]/button/i').click()

# Click the fields that are hidden
hidden = [7, 12, 14, 15, 17, 19, 20, 21, 22, 23, 24]
for val in hidden:
    x_path = '//*[@id="team-players"]/div[2]/div[2]/div/div[%s]/div[2]/label' %val
    driver.find_element_by_xpath(x_path).click()

# Appy the filter    
driver.find_element_by_xpath('//*[@id="team-players"]/div[2]/div[3]/a[2]').click()

# get the tables in source
tables = pd.read_html(driver.page_source)
data = tables[1]
data.rename(columns={'Unnamed: 22':"Yellow_Cards", "Unnamed: 23":"Red_Cards"})


driver.close()

Выход:

print (data.columns)
Index(['№', 'Player', 'Pos', 'Apps', 'Min', 'G', 'NPG', 'A', 'Sh90', 'KP90',
       'xG', 'NPxG', 'xA', 'xGChain', 'xGBuildup', 'xG90', 'NPxG90', 'xA90',
       'xG90 + xA90', 'NPxG90 + xA90', 'xGChain90', 'xGBuildup90',
       'Yellow_Cards', 'Red_Cards'],
      dtype='object')



print (data)
       №                 Player    ...     Yellow_Cards  Red_Cards
0    1.0      Cristiano Ronaldo    ...                2          0
1    2.0        Mario Mandzukic    ...                3          0
2    3.0           Paulo Dybala    ...                1          0
3    4.0  Federico Bernardeschi    ...                2          0
4    5.0         Blaise Matuidi    ...                2          0
5    6.0      Rodrigo Bentancur    ...                5          1
6    7.0          Juan Cuadrado    ...                2          0
7    8.0       Leonardo Bonucci    ...                1          0
8    9.0         Miralem Pjanic    ...                4          0
9   10.0           Sami Khedira    ...                0          0
10  11.0      Giorgio Chiellini    ...                1          0
11  12.0          Medhi Benatia    ...                2          0
12  13.0          Douglas Costa    ...                2          1
13  14.0               Emre Can    ...                2          0
14  15.0           Mattia Perin    ...                1          0
15  16.0      Mattia De Sciglio    ...                0          0
16  17.0      Wojciech Szczesny    ...                0          0
17  18.0        Andrea Barzagli    ...                0          0
18  19.0            Alex Sandro    ...                3          0
19  20.0         Daniele Rugani    ...                1          0
20  21.0             Moise Kean    ...                0          0
21  22.0           João Cancelo    ...                2          0
22   NaN                    NaN    ...               36          2

[23 rows x 24 columns]
...