Очистка веб — страниц-Занижение данных о лучших игроках

#python #html #web-scraping

Вопрос:

Я пытался соскрести данные с сайта Understat (https://understat.com/league/EPL), в то время как я мог легко очистить данные для лучших игроков, я не мог сделать то же самое для данных лучших команд. Пожалуйста, помогите мне с этим. Вот мой код.

 import pandas as pd
from bs4 import BeautifulSoup
from urllib.request import urlopen

scrape_url="https://understat.com/league/EPL/2020"
page_connect = urlopen(scrape_url)

page_html=BeautifulSoup(page_connect, 'html.parser')
page_html.findAll(name="script")

json_raw_string= page_html.findAll(name="script")[1].string
json_raw_string

start_ind = json_raw_string.index("\")
stop_ind = json_raw_string.index("')")

data = json_raw_string[start_ind:stop_ind]
data = data.encode("utf8").decode("unicode_escape")
json.loads(data)

df = pd.json_normalize(json.loads(data))
df.head()```
 

Комментарии:

1. Какую информацию вы хотите получить? Последний стол с игроками?

2. Нет, стол над ним. Таблица команд в порядке ранжирования.

3. json_raw_string= page_html.findAll(имя=»скрипт»)[3].строка (выберите индекс 3)

4. Я попробовал это, это дает совершенно другую таблицу всего с одним рядом Астон Виллы.

5. интересно, но и странно тоже

Ответ №1:

Данные приведены в индексе 2, но вам нужно вычислить итоговую таблицу. Например:

 import json
import pandas as pd
from bs4 import BeautifulSoup
from urllib.request import urlopen

scrape_url = "https://understat.com/league/EPL/2020"
page_connect = urlopen(scrape_url)

page_html = BeautifulSoup(page_connect, "html.parser")
page_html.findAll(name="script")

json_raw_string = page_html.findAll(name="script")[2].string

start_ind = json_raw_string.index("\")
stop_ind = json_raw_string.index("')")

data = json_raw_string[start_ind:stop_ind]
data = data.encode("utf8").decode("unicode_escape")

data = json.loads(data)

df = pd.DataFrame(data.values())
df = df.explode("history")
h = df.pop("history")
df = pd.concat([df.reset_index(drop=True), pd.DataFrame(h.tolist())], axis=1)

# for example print xG column:
print(df.groupby("title")["xG"].sum().sort_values(ascending=False))
 

Печать xG столбца, отсортированного по убыванию:

 title
Manchester City            77.715218
Liverpool                  72.207518
Chelsea                    68.655594
Manchester United          63.172237
West Ham                   60.338271
Leeds                      59.258638
Leicester                  58.800116
Aston Villa                56.715489
Tottenham                  56.676279
Brighton                   53.819028
Arsenal                    52.247381
Everton                    49.237118
Southampton                45.284568
Newcastle United           43.959188
Fulham                     41.055309
Wolverhampton Wanderers    38.619038
Burnley                    38.127929
Crystal Palace             35.286608
West Bromwich Albion       34.971290
Sheffield United           33.159177
Name: xG, dtype: float64
 

Комментарии:

1. Большое вам спасибо!