Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将原始javascript对象转换为python字典?_Javascript_Python_Json_Web Scraping - Fatal编程技术网

如何将原始javascript对象转换为python字典?

如何将原始javascript对象转换为python字典?,javascript,python,json,web-scraping,Javascript,Python,Json,Web Scraping,当屏幕抓取某个网站时,我从标签中提取数据。 我得到的数据不是标准的JSON格式。我不能使用json.loads() # from js_obj = '{x:1, y:2, z:3}' # to py_obj = {'x':1, 'y':2, 'z':3} 目前,我使用regex将原始数据转换为JSON格式。 但当我遇到复杂的数据结构时,我感觉很糟糕 您有更好的解决方案吗?这可能不适用于所有地方,但首先,这里有一个简单的正则表达式,它应该将键转换为带引号的字符串,以便您可以传递到json.lo

当屏幕抓取某个网站时,我从标签中提取数据。
我得到的数据不是标准的
JSON
格式。我不能使用
json.loads()

# from
js_obj = '{x:1, y:2, z:3}'

# to
py_obj = {'x':1, 'y':2, 'z':3}
目前,我使用
regex
将原始数据转换为
JSON
格式。
但当我遇到复杂的数据结构时,我感觉很糟糕


您有更好的解决方案吗?

这可能不适用于所有地方,但首先,这里有一个简单的正则表达式,它应该将键转换为带引号的字符串,以便您可以传递到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}}'

不包括对象

  • json.loads()
    不接受未定义的,您必须更改为null
  • json.loads()
    仅接受双引号
    • {“foo”:1,“bar”:null}
如果您确定javascript代码的键名上只有双引号,请使用此选项

导入json
json_text=“”{“foo”:1,“bar”:未定义的}”
json_text=re.sub(r'(“\s*:\s*)未定义(\s*[,}]),'\\1null\\2',json_text)
py_obj=json.load(json_文本)
  • ast.literal\u eval()
    不接受未定义的,您必须更改为
  • ast.literal\u eval()
    不接受null,您必须更改为None
  • ast.literal\u eval()
    不接受true,您必须更改为true
  • ast.literal\u eval()
    不接受false,您必须更改为false
  • ast.literal\u eval()
    接受单引号和双引号
    • {foo:1,“bar:None}
      {'foo:1,“bar:None}
导入ast
js_obj=“{'foo':1,'bar':未定义的}”
js\u obj=re.sub(r'([\'\“]\s*:\s*)未定义(\s*[,}]),'\\1None\\2',js\u obj)
js\u obj=re.sub(r'([\'\“]\s*:\s*)null(\s*[,}]),'\\1None\\2',js\u obj)
js\u obj=re.sub(r'([\'\“]\s*:\s*)NaN(\s*[,}]),'\\1None\\2',js\u obj)
js\u obj=re.sub(r'([\'\“]\s*:\s*)true(\s*[,}]),'\\1True\\2',js\u obj)
js\u obj=re.sub(r'([\'\“]\s*:\s*)false(\s*[,}]),'\\1False\\2',js\u obj)
py_obj=ast.literal_eval(js_obj)

如果系统上有可用的
节点
,您可以要求它为您计算javascript表达式,并打印字符串化结果。然后,生成的JSON可以馈送到
JSON.loads

def evaluate_javascript:
“”“计算node.js中的javascript表达式并将其字符串化,然后转换
Python对象“”的结果JSON
node=Popen(['node','-',stdin=PIPE,stdout=PIPE)
stdout,z=node.communicate(f'console.log(JSON.stringify({s}))'.encode('utf8'))
返回json.load(stdout.decode('utf8'))

今天下午我面临同样的问题,我终于找到了一个很好的解决方案。就是

JSON5的语法更类似于本机JavaScript,因此它可以帮助您解析非标准JSON对象

您可能想退房。

使用
你想解析的数据有什么不标准的地方?@HuuNguyen我想将
普通的javascript数据结构
解析到python对象。哦,我没有看到
js_obj
的键周围没有引号。您的数据结构有多复杂?在不知道您要解决的问题之前,很难提出任何建议。@HuuNguyen
js_obj
可能已经有了类似的问题:它们都没有提供任何现成的解决方案JSON不支持指向demjson和jsonnet的循环对象链接这是最快的库。我试着使用demjson,我的脚本运行了10.5秒。Pyjson5在0.004s中完成此任务。@Inventor您能发布一个如何工作的示例吗?
import demjson

# from
js_obj = '{x:1, y:2, z:3}'

# to
py_obj = demjson.decode(js_obj)
import json, _jsonnet

# from
js_obj = '{x:1, y:2, z:3}'

# to
py_obj = json.loads(_jsonnet.evaluate_snippet('snippet', js_obj))
import ast

# from
js_obj = "{'x':1, 'y':2, 'z':3}"

# to
py_obj = ast.literal_eval(js_obj)
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}