#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. Большое вам спасибо!