当屏幕抓取某个网站时,我从<script>
标签中提取数据。
我得到的数据不是标准JSON
格式。我无法使用json.loads()
.
# from
js_obj = '{x:1, y:2, z:3}'
# to
py_obj = {'x':1, 'y':2, 'z':3}
目前,我使用regex
将原始数据转换为JSON
格式。
但是当我遇到复杂的数据结构时,我感觉很糟糕。
你有更好的解决方案吗?
当屏幕抓取某个网站时,我从<script>
标签中提取数据。
我得到的数据不是标准JSON
格式。我无法使用json.loads()
.
# from
js_obj = '{x:1, y:2, z:3}'
# to
py_obj = {'x':1, 'y':2, 'z':3}
目前,我使用regex
将原始数据转换为JSON
格式。
但是当我遇到复杂的数据结构时,我感觉很糟糕。
你有更好的解决方案吗?
demjson.decode()
import demjson
# from
js_obj = '{x:1, y:2, z:3}'
# to
py_obj = demjson.decode(js_obj)
jsonnet.evaluate_snippet()
import json, _jsonnet
# from
js_obj = '{x:1, y:2, z:3}'
# to
py_obj = json.loads(_jsonnet.evaluate_snippet('snippet', js_obj))
ast.literal_eval()
import ast
# from
js_obj = "{'x':1, 'y':2, 'z':3}"
# to
py_obj = ast.literal_eval(js_obj)
这可能不会在任何地方都有效,但作为开始,这里有一个简单的正则表达式,它应该将键转换为带引号的字符串,以便您可以传递到 json.loads。或者这就是你已经在做的事情?
In[70] : quote_keys_regex = r'([\{\s,])(\w+)(:)'
In[71] : re.sub(quote_keys_regex, r'\1"\2"\3', js_obj)
Out[71]: '{"x":1, "y":2, "z":3}'
In[72] : js_obj_2 = '{x:1, y:2, z:{k:3,j:2}}'
Int[73]: re.sub(quote_keys_regex, r'\1"\2"\3', js_obj_2)
Out[73]: '{"x":1, "y":2, "z":{"k":3,"j":2}}'
import json5
js_obj = '{x:1, y:2, z:3}'
py_obj = json5.loads(js_obj)
print(py_obj)
# output
# {'x': 1, 'y': 2, 'z': 3}
如果您node
在系统上可用,您可以要求它为您评估 javascript 表达式,并打印字符串化的结果。然后可以将生成的 JSON 提供给json.loads
:
def evaluate_javascript(s):
"""Evaluate and stringify a javascript expression in node.js, and convert the
resulting JSON to a Python object"""
node = Popen(['node', '-'], stdin=PIPE, stdout=PIPE)
stdout, _ = node.communicate(f'console.log(JSON.stringify({s}))'.encode('utf8'))
return json.loads(stdout.decode('utf8'))