Как извлечь содержимое в указанных c javascript тегах python? - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь извлечь весь график и результаты международного турнира Dota2 TI9 из этой страницы . Информация, которую я ищу, находится под тегом и под «schedule_data».

Пока это то, что я получил

import requests, re, json
from bs4 import BeautifulSoup as bs
url = 'http://www.dota2.com/international/schedule/0/0/?l=english'
page = requests.get(url)
soup = bs(page.text,'html.parser')
all_javascript = soup.find_all(name='script',type='text/javascript')
all_javascript[:] = [x for x in all_javascript if(re.search("schedule_data",x.text))]  
data = all_javascript[0]
new_data = json.loads(data.text)

Я нахожу все теги 'script' и затем ищу шаблон «schedule_data» для определения тега, который мне нужен. Однако теперь последняя строка завершается с ошибкой

new_data = json.loads(data.text)
Traceback (most recent call last):

  File "<ipython-input-68-447d26a16d5b>", line 1, in <module>
    new_data = json.loads(data.text)

  File "C:\Users\templ\Anaconda3\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)

  File "C:\Users\templ\Anaconda3\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())

  File "C:\Users\templ\Anaconda3\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None

JSONDecodeError: Expecting value

Я посмотрел решение здесь json загружает пример , Здесь и здесь , но ни один из них не решает проблему. Эти примеры, кажется, предполагают, что это ошибка запроса URL или ошибка перевода, которая приводит к ошибке загрузки json, но у меня нет ни одного из них.

print(type(data.text))

возвращает str для меня, который, как я понимаю, является правильным типом данных для json загрузок.

Пожалуйста, помогите

1 Ответ

0 голосов
/ 04 марта 2020

Пожалуйста, проверьте это.

import requests, re, json
import ast

from bs4 import BeautifulSoup as bs
url = 'http://www.dota2.com/international/schedule/0/0/?l=english'
page = requests.get(url)
soup = bs(page.text,'html.parser')
all_javascript = soup.find_all(name='script',type='text/javascript')

for x in all_javascript:
    if re.search("schedule_data", x.text):
        data = str(x).split("$( '#ScheduleArea' ).tournamentSchedule(")[1].split(');')[0].strip().replace('\n', '').replace('\t', '').replace('\r', '')
        data_dict = ast.literal_eval(data)
        print(data_dict['schedule_data'])

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