【问题标题】:How can I scrape JSON value from key?如何从键中抓取 JSON 值?
【发布时间】:2022-01-17 03:17:48
【问题描述】:
import requests
from datetime import datetime

gg = []

now = datetime.now()
current_time = now.strftime("%Y-%m-%dT%H:%M:%S")

url = ("https://sportsbook-sm-distribution-api.nsoft.com/api/v1/events?deliveryPlatformId=3&dataFormat=%7B%22default%22:%22object%22,%22events%22:%22array%22,%22outcomes%22:%22object%22%7D&language=%7B%22default%22:%22sr-Latn%22,%22events%22:%22sr-Latn%22,%22sport%22:%22sr-Latn%22,%22category%22:%22sr-Latn%22,%22tournament%22:%22sr-Latn%22,%22team%22:%22sr-Latn%22,%22market%22:%22sr-Latn%22%7D&timezone=Europe%2FBelgrade&company=%7B%7D&companyUuid=4dd61a16-9691-4277-9027-8cd05a647844&filter[sportId]=3&filter[from]={}&sort=categoryPosition,categoryName,tournamentPosition,tournamentName,startsAt&offerTemplate=WEB_OVERVIEW&shortProps=1").format(current_time)

response = requests.get(url)
matches = response.json()
print(matches) #This is my json document

我正在尝试从投注网站上获取赔率。我对 python 很陌生,我需要一些帮助。

某种“奇数id”存储在键“b”中。所以基本上对于这个json文件中的每一个匹配,如果匹配包含键“b”的值为2763,我想抓取键“g”的值并将其存储在我的列表“gg”中(键“g”的值很奇怪我想刮)。但是,如果匹配项不包含值为 2763 的键“b”,那么对于该匹配项,我只想将一次“1.00”附加到列表“gg”。

for match in matches:
    mat = matches['data']['events']
    for s in range(len(mat)):
        o = mat[s]['o']
        for element in o:
            h = o[element]['h']
            for x in h:
                if h[x]['b'] == 2763:
                gg.append(h[x]['g'])

使用此命令,我可以获取赔率,但如果匹配没有 'b':2763 (oddid),我不知道如何将“1.00”附加到 GG

【问题讨论】:

  • 此数据中有什么匹配项?
  • [数据][事件]中有匹配项。赔率存储在 ['data']['events']['o']['h'] 中。在“h”中有一些 Id,在那个 id 中有一个带有值的奇数键“b”(在我的情况下是 2763)和带有我想抓取的值的奇数键“g”。谢谢!

标签: python json web-scraping python-requests


【解决方案1】:

根据我对您的问题的理解。这应该是解决方案。

   json = {
        'b': 2763,
        'g': 'odd number'
    }
    
    x = 'b'
    y = 2763
    gg = []
    
    for key, value in json.items():
        if x == key and y == value:  # if finds b: 2763
            gg.append(json.get('g'))
        elif x == key and y != value:
            gg.append(1.00)
            break

您可以使用理解来减少行数。

【讨论】:

  • 问题是匹配有多个键“b”,但我只需要找到值为2763的b。所以如果它找到b但值不是2763,它将多次附加1.00并且我只想要一次。感谢您的回答!
  • 第一次满足条件时可以使用break退出循环。
  • 我不能使用 .items() 因为它是 dict。当我尝试“for key, value”时,我收到错误“ValueError:要解压的值太多(预期为 2)”。而且我的 json 文件有点困难。如果您有时间尝试运行我的脚本,那对我来说意义重大,如果您不这样做,无论如何感谢您的宝贵时间!
  • 用你收到的JSON文件更新问题,我会检查的。
  • 我不会将文件保存到电脑上的文档中,而是从请求中使用它。匹配是我的“文件”。谢谢
【解决方案2】:

我尚未验证您的代码,但我假设它有效并且您了解它的作用。你需要的是一面旗帜。标志只是一个布尔值 (True/False),我们将其命名为 has_2763。你只需要在每次比赛开始时重置它

for match in matches:
    mat = matches['data']['events']
    for s in range(len(mat)):
        has_2763 = False
        o = mat[s]['o']
        for element in o:
            h = o[element]['h']
            for x in h:
                if h[x]['b'] == 2763:
                    gg.append(h[x]['g'])
                    has_2763 = True
        if not has_2763:
            gg.append("1.00")

【讨论】:

  • 我试过了,有问题。每场比赛都有多个 OddId。 Match1:{ [{"OddId":2763, "Odd":1.5}, {"OddId":2764, "Odd":2.0}, {"OddId":2765, "Odd:2.5}]}。Match2:{ [{"OddId":2762, "Odd":1.8}, {"OddId":2764, "Odd":2.0}, {"OddId":2765, "Odd:2.5}]}。当我运行代码时,在 match1 中它会复制奇数(1.5),但在 match2 中没有奇数:2763,它会在 gg(list) 中添加三次“1.00”,因为存在三个不同的奇数。这些匹配只是向您展示我的问题的示例。在实际数据中,“奇数”是“b”,奇数(我想废弃的值)是“g”。感谢您的回答!
  • 我不明白问题出在哪里。我刚刚验证了你的代码。它有效:在您提供的 url 数据的每次匹配中都有一个值为 2763 的 b,因此它不能附加三倍“1.00”,除非您使用不同的数据...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2021-09-05
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多