【问题标题】:How to search for a certain term between brackets { } in a string/json - Python/JSON如何在字符串/json中的括号{}之间搜索某个词 - Python/JSON
【发布时间】:2018-03-17 00:36:50
【问题描述】:
import json
import requests
import sys

exampleURL = 'https://apps.runescape.com/runemetrics/quests?user=Marebelle'

questName = 'All Fired Up'
response = requests.get(exampleURL)

if response.status_code==200:
    questData = response.content.decode('utf-8')

我如何搜索 questName 并让它只打印这个 {"title":"All Fired Up","status":"COMPLETED","difficulty":1,"members":true,"questPoints":1,"userEligible":true}

抱歉格式错误,感谢任何帮助,谢谢!

【问题讨论】:

  • 您导入了json 模块,但您没有使用它。用json.loads(questData) 解析questData 并在字典中找到您要查找的对象。
  • 如何格式化您的帖子:使用四个空格缩进,然后使用`(旁边的东西!)格式化代码的各个部分。
  • 请附上questData的例子(一个有效的)l。
  • 如果 questData 是一长串这样的字符串:{"title":"All Fired Up","status":"COMPLETED","difficulty":1,"members":true ,"questPoints":1,"userEligible":true},我们怎样才能在这个长长的字符串列表中搜索 All Fired Up,然后打印 { } 之间的所有信息?这说明我在问什么吗?
  • 如果您知道“All Fired Up”"title" 的值之一,那么我们可以使用if questData["title"] == "All Fired Up" 进行搜索。也许查看 json 键的行为可能会帮助您更好地理解 json 响应,尝试在 data.keys() 中使用 k:print data[k]

标签: python json search split cut


【解决方案1】:

这是我的看法:

import requests

exampleURL = 'https://apps.runescape.com/runemetrics/quests?user=Marebelle'

questName = 'All Fired Up'
response = requests.get(exampleURL)

if response.status_code==200:
    questData = next((i for i in response.json()['quests'] if i['title']== questName),None)
    print(questData)

返回:

{'difficulty': 1,
 'members': True,
 'questPoints': 1,
 'status': 'COMPLETED',
 'title': 'All Fired Up',
 'userEligible': True}

更新:

import requests
from collections import OrderedDict

exampleURL = 'https://apps.runescape.com/runemetrics/quests?user=Marebelle'

questName = 'All Fired Up'
keys = ['title','status','difficulty','members','questPoints','userEligible']

response = requests.get(exampleURL)

if response.status_code==200:
    questData = next((i for i in response.json()['quests'] if i['title']== questName),None)
    d = OrderedDict((key,questData.get(key,'')) for key in keys)
    print(d)

【讨论】:

  • 好的,它会打印我想要的所有信息,但它的顺序不正确,每次我运行代码时它都会以随机顺序打印。第一次运行:{'members': True, 'userEligible': True, 'status': 'COMPLETED', 'title': 'All Fired Up', 'questPoints': 1, 'difficulty': 1} 第二次运行:{ 'members': True, 'title': 'All Fired Up', 'difficulty': 1, 'status': 'COMPLETED', 'questPoints': 1, 'userEligible': True}
  • 那为什么要随机排列呢?
  • @SirJohnson 因为 python 字典是散列的并且设计上是无序的,请参见这里Why is the order in dictionaries and sets arbitrary?
  • 有没有办法不让它无序? @davedw
  • @SirJohnson 你的意思是你想让它们按顺序排列?字典通常不意味着有顺序,而是通过键访问。
【解决方案2】:

实施来自 cmets 的 Blender 的建议,将这些行添加到您已经拥有的代码下方:

data = json.loads(questData)

for quest in data['quests']:
    if quest['title'] == questName:
        print quest

会得到:

{u'status': u'COMPLETED', u'title': u'All Fired Up', u'userEligible': True, u'difficulty': 1, u'members': True, u'questPoints': 1}

【讨论】:

  • 我对你的 for 语句中定义的任务感到困惑,请解释一下
  • response 中的可用键是[u'loggedIn', u'quests'],如果您检查来自print data.keys() 的响应,您可以看到这一点,并且您想要的信息在从quests 键获得的值内,所以我们需要解析data[quests]中的值。
【解决方案3】:
import json
import requests
import sys

exampleURL = 'https://apps.runescape.com/runemetrics/quests?user=Marebelle'

questName = 'All Fired Up'
response = requests.get(exampleURL)

if response.status_code==200:
    res = response.json()
    for y in res['quests']:
        if(y["title"] == questName):
            print(y)

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 2011-03-26
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多