请求返回的文本字符串不会 ast.literal_eval 列出

Text string returned by request won't ast.literal_eval to list

调用带有请求的 API 以查找代码的描述。 API returns 看起来像列表的字符串。我无法将字符串转换为带有 ast.literal_eval 的列表。我尝试了多种响应类型(.text、.raw 等)和 map、str 等的变体来转换字符串。希望将响应放入任何可用的 Python 对象。

import requests
import ast

burl = "https://clinicaltables.nlm.nih.gov/" \
"api/icd10cm/v3/search?sf=code,name&maxList=1&terms="

dotted_code = "W59.21XS"

r = requests.get(burl+dotted_code).text

print(r)

响应是: [1,["W59.21XS"],null,[["W59.21XS","Bitten by turtle, sequela"]]]

但如果我添加:

l = ast.literal_eval(r)
print(l)

我得到:

文件 "D:\Local\Continuum\anaconda3\lib\ast.py",第 55 行,在 _convert_num 提高 ValueError('malformed node or string: ' + repr(node))

ValueError:节点或字符串格式错误:<_ast.Name 0x0000015A01B670B8 处的对象>

有没有更好的方法将 return 文本转换为可用的 Python 对象?

那是 JSON:

>>> import json
>>> json.loads("""[1,["W59.21XS"],null,[["W59.21XS","Bitten by turtle, sequela"]]]""")
[1, ['W59.21XS'], None, [['W59.21XS', 'Bitten by turtle, sequela']]]

为什么 literal_eval 不起作用的原因是 null 在 Python 中不存在,所以 literal_eval 没有想法如何处理它。如果您要将 null 更改为 None(或字符串 'null'),那么 literal_eval 将起作用:

>>> literal_eval('''[1,["W59.21XS"], None, [["W59.21XS","Bitten by turtle, sequela"]]]''')
[1, ['W59.21XS'], None, [['W59.21XS', 'Bitten by turtle, sequela']]]

您可以使用 response.json:

>>> r = requests.get('https://clinicaltables.nlm.nih.gov/api/icd10cm/v3/search?sf=code,name&maxList=1&terms=W59.21XS')
>>> r.json()
[1, ['W59.21XS'], None, [['W59.21XS', 'Bitten by turtle, sequela']]]
#                 ^ Note that null was automatically converted to None