在Python中不用json库解析JSON对象(仅用正则表达式)
我现在正在用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)