在Python中不用json库解析JSON对象(仅用正则表达式)

2 投票
2 回答
7127 浏览
提问于 2025-04-18 07:22

我现在正在用Instagram API开发一个小应用,这个API在进行GET操作时会返回JSON格式的“对象”。为了获取这些响应,我现在使用的是urllib2。

这是我正在上课时的一个作业,最大的挑战是我们不能使用JSON库来快速解析和获取Instagram响应中的信息。我们被迫只能使用正则表达式库(就只有这个)来正确解析信息。

比如,要获取某个用户的动态页面,Instagram的响应格式遵循这个链接中展示的结构。

老实说,我已经花了3个小时试图自己搞明白这个问题,还在网上查了很多资料,但大多数回答都建议使用JSON库。

如果有任何建议或者小窍门,那就太好了。

另外,除了urllib2(可能算作外部库),我不被允许使用任何其他外部库(也就是第三方库),只能使用Python 2.7自带的库。

提前谢谢大家。

2 个回答

0

你觉得用一个功能性解析库加上一点正则表达式怎么样?

def parse(seq):
    'Sequence(Token) -> object'
    ...
    n = lambda s: a(Token('Name', s)) >> tokval
    def make_array(n):
        if n is None:
            return []
        else:
            return [n[0]] + n[1]
    ...
    null = n('null') >> const(None)
    true = n('true') >> const(True)
    false = n('false') >> const(False)
    number = toktype('Number') >> make_number
    string = toktype('String') >> make_string
    value = forward_decl()
    member = string + op_(':') + value >> tuple
    object = (
        op_('{') +
        maybe(member + many(op_(',') + member)) +
        op_('}')
        >> make_object)
    array = (
        op_('[') +
        maybe(value + many(op_(',') + value)) +
        op_(']')
        >> make_array)
    value.define(
          null
        | true
        | false
        | object
        | array
        | number
        | string)
    json_text = object | array
    json_file = json_text + skip(finished)

    return json_file.parse(seq)

你需要这个 funcparserlib 库来实现。

注意:光用纯正则表达式来做这件事太难了。你需要写一种“解析器”——所以不如直接用一个解析库来帮你处理一些繁琐的部分。

1

其实这并不复杂。当你发出一个获取请求时,你会收到一大堆代码,但你只需要其中的一小部分。例如,如果你想从某个用户那里获取新闻动态,并提取出图片和它们的说明文字:

query = "https://api.instagram.com/v1/users/"+profile_id+"/media/recent?access_token="+token
response = urlopen(query)
the_page = response.read()
feed = {}
feed['images'] = []
feed['captions'] = []
matchImage = re.findall(r'"standard_resolution":{"url":"(.*?)"', the_page)
matchCaption = re.findall(r'"caption":(.*?),(.*?),', the_page)
if len(matchImage) > 0:
    for x in xrange(0,len(matchImage)):
    image = matchImage[x].replace('\\','')
    if matchCaption[x][0] == 'null':
        feed['images'].append(image)
        feed['captions'].append('No Caption')
    else:
        caption = re.search(r'"text":"(.*?)"', matchCaption[x][1])
        caption = caption.group(1).replace('\\','')
        feed['images'].append(image)
        feed['captions'].append(caption)

撰写回答