Как получить данные из тега скрипта на сайте, используя Python? - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь извлечь данные таблицы с этого веб-сайта - 'https://understat.com/league/EPL' Когда я просматривал исходный код, таблица сохраняется в формате. Я хочу знать, как извлечь данные из скрипта в удобном формате.

Я попытался использовать решение из аналогичного вопроса ( Как получить переменные тега скрипта с веб-сайта, используя Python):

    import requests
    import bs4
    import json

    url = 'https://understat.com/league/EPL'
    r = requests.get(url)

    bs = bs4.BeautifulSoup(r.text, "html.parser")
    scripts = bs.find_all('script')

    for s in scripts:
        if 'var datesData' in s.text:
            script = s.text
            print(script)

Однако ничего не печатается, то есть он не может найти 'var dateData' в скрипте, но когда я просто печатаю (скрипты), я получаю:

[<script>
            var THEME = localStorage.getItem("theme") || 'DARK';
            document.body.className = "theme-" + THEME.toLowerCase();
        </script>,
 <script>
    var datesData   = JSON.parse('\x5B\x7B\x22id\x22\x3A\x2211643\x22,\x22isResult\x22\x3Atrue,\x22h\x22\x3A\x7B\x22id\x22\x3A\x2287\x22,\x22title\x22\x3A\x22Liverpool\x22,\x22short_title\x22\x3A\x22LIV\x22\x7D,\x22a\x22\x3A\x7B\x22id\x22\x3A\x2279\x22,\x22title\x22\x3A\x22Norwich\x22,\x22short_title\x22\x3A\x22NOR...


and so on
]

Как видите, второй список содержит 'var dateData', но мой код не печатает его.

Я хочу получить этот второй сценарий из списка и получить данные в JSON .parse (), чтобы я мог в конечном итоге создать фрейм данных. Один из вариантов, который я могу сделать, - скопировать всю эту строку из исходного кода URL-адреса и передать ее в json .loads (), чтобы использовать ее, например:

js = json.loads('\x5B\x7B\x22id\x22\x3A\x2211643\x22,\x22isResult\x22\x3Atrue,\x22h\x22\...')

, что дает мне результат:

[{'id': '11643',
  'isResult': True,
  'h': {'id': '87', 'title': 'Liverpool', 'short_title': 'LIV'},
  'a': {'id': '79', 'title': 'Norwich', 'short_title': 'NOR'},
  'goals': {'h': '4', 'a': '1'},
  'xG': {'h': '2.23456', 'a': '0.842407'},
  'datetime': '2019-08-09 20:00:00',
  'forecast': {'w': '0.7377', 'd': '0.1732', 'l': '0.0891'}},
 {'id': '11644',
  'isResult': True,
  'h': {'id': '81', 'title': 'West Ham', 'short_title': 'WHU'},
  'a': {'id': '88', 'title': 'Manchester City', 'short_title': 'MCI'},
  'goals': {'h': '0', 'a': '5'},
  'xG': {'h': '1.2003', 'a': '3.18377'},
  'datetime': '2019-08-10 12:30:00',
  'forecast': {'w': '0.0452', 'd': '0.1166', 'l': '0.8382'}},
 {'id': '11645',
  'isResult': True,
...

Однако лучший способ - вызвать данные с веб-сайта, чтобы я мог учесть изменения, которые БУДУТ произойти позже с данными.

TL; DR: я хочу прочитать данные, хранящиеся в тег скрипта в читаемом формате с использованием Python

1 Ответ

0 голосов
/ 17 июня 2020

Возможно что-то вроде

import ast
import json
import re
from pprint import pprint

import requests

pattern = re.compile(r'\bvar\s+datesData\s*=\s*JSON\.parse\((.+?)\)')

url = 'https://understat.com/league/EPL'

r = requests.get(url)
s = r.text
m = pattern.search(s)
data = m.group(1)
o = json.loads(ast.literal_eval(data))
pprint(o[:3])

, что дает мне

[{'a': {'id': '79', 'short_title': 'NOR', 'title': 'Norwich'},
  'datetime': '2019-08-09 20:00:00',
  'forecast': {'d': '0.1732', 'l': '0.0891', 'w': '0.7377'},
  'goals': {'a': '1', 'h': '4'},
  'h': {'id': '87', 'short_title': 'LIV', 'title': 'Liverpool'},
  'id': '11643',
  'isResult': True,
  'xG': {'a': '0.842407', 'h': '2.23456'}},
 {'a': {'id': '88', 'short_title': 'MCI', 'title': 'Manchester City'},
  'datetime': '2019-08-10 12:30:00',
  'forecast': {'d': '0.1166', 'l': '0.8382', 'w': '0.0452'},
  'goals': {'a': '5', 'h': '0'},
  'h': {'id': '81', 'short_title': 'WHU', 'title': 'West Ham'},
  'id': '11644',
  'isResult': True,
  'xG': {'a': '3.18377', 'h': '1.2003'}},
 {'a': {'id': '238', 'short_title': 'SHE', 'title': 'Sheffield United'},
  'datetime': '2019-08-10 15:00:00',
  'forecast': {'d': '0.3923', 'l': '0.3994', 'w': '0.2083'},
  'goals': {'a': '1', 'h': '1'},
  'h': {'id': '73', 'short_title': 'BOU', 'title': 'Bournemouth'},
  'id': '11645',
  'isResult': True,
  'xG': {'a': '1.59864', 'h': '1.34099'}}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...