【问题标题】:How to extract content in specific javascript tagsin python?如何在python中提取特定javascript标签中的内容?
【发布时间】:2020-06-17 05:57:26
【问题描述】:

我正在尝试从this page 中提取 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)

我找到所有的“脚本”标签,然后搜索“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 loads exampleHerehere 的解决方案,但这些都不能解决问题。这些示例似乎表明是 url 请求失败或翻译错误导致 json 加载失败,但我没有这些。

print(type(data.text))

为我返回 str,我认为这是 json 加载的正确数据类型。

请帮忙

【问题讨论】:

  • 你能说说你需要什么输出吗?
  • 为什么是 all_javascript[:] = ?请分享相关的 HTML 以及程序中的值,请参阅minimal reproducible example
  • 我需要按游戏提取比赛 ID、开始时间和结束时间以及获胜者。我现在正在尝试从该来源获取比赛 ID、获胜者和失败者,并使用 api.opendota.com/api/matches{match_id} 来获取相关的比赛开始和结束时间。我想将这一切放入一个漂亮的 Excel 中,如下所示:[比赛 ID,开始时间(EDT),日期,日期,比赛长度,A 队,B 队,获胜者]

标签: python beautifulsoup


【解决方案1】:

请看看这个。

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'])

【讨论】:

  • 谢谢 :) 这行得通。我开始阅读抽象语法树,但我不确定我是否完全理解代码在做什么。有这方面的 ELI 来源吗?
  • 没问题,一旦文本在 if re.search("schedule_data", x.text): 中匹配。我正在尝试基于 $( '#ScheduleArea' ).tournamentSchedule( 拆分代码,这包含您需要的 dict 所以我正在获取索引 1 的数据,然后再次拆分直到 *$( ' #ScheduleArea' ).tournamentSchedule( 右括号,因此拆分基于 ); 然后只需替换 \n\t\r 就是这样。
  • @VaidyanathanViswanathanSauna 如果您认为这个答案可以接受,您应该接受它,因为响应者花费时间和精力将答案放在一起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多