我正在尝试从服务器的响应中获取有效的 python 列表,如下所示:
window.__search.list=[{"order":"1","base":"LAW","n":"148904","access":{"css":"avail_yes","title":"\u042 2\u0435\u043a\u0441\u0442\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d"},"title":"\"\u0410\u0440\u0431\u0438\u0442\u0440\u0430\u0436\u043d\u044b\u0439\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443\u0430\u043b\u044c\u043d\u044b\u0439\u043a\u043e\u0434\u0435\u043a\u0441\u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439\u0424\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u0438\" \u043e\u0442 24.07.2002 N 95-\u0424\u0417 (\u0440\u0435\u0434. \u043e\u0442 02.07.2013) (\u0441 \u0438\u0437\u043c. \u0438 \u0434\u043e\u043f.,\u0432\u0441\u0442\u0443\u043f\u0430 \u044e\u0449\u0438\u043c\u0438\u0432 \u0441\u0438\u043b\u0443 \u0441 01.08.2013)"}, ... }];
我通过切断“window.__search.list=”和“;”来做到这一点使用 data = json.loads(re.search(r"(?=\[)(.*?)\s*(?=\;)", url).group(1))< 从字符串中获取
然后它看起来像标准 JSON:
[{u'access': {u'css': u'avail_yes', u'title': u'\u0422\u0435\u043a\u0441\u0442\u0434\u043e\u043a\u04 43\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d'},u'title': u'"\u0410\u0440\u0431\u0438\u0442\u0440\u0430\u0436\u043d\u044b\u0439\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443\u0430\u043b\u044c\u043d\u044b\u0439\u043a\u043e\u0434\u0435\u043a\u0441\u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439\u0424\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u0438" \u043e\u0442 24.07.2002 N 95-\u0424\u0417 (\u04 40\u0435\u0434. \u043e\u0442 02.07.2013) (\u0441 \u0438\u0437\u043c. \u0438 \u0434\u043e \u043f.,\u0432\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u043c\u0438 \u0432 \u0441 \u0438\u043b\u0443 \u0441 01.08.2013)', u'base': u'LAW', u'order': u'1', u'n': u'148904'}, ... }]
但有时,在迭代其他网址期间,我会收到如下错误:
File "/Developer/Python/test.py", line 123, in order_search
data = json.loads(re.search(r"(?=\[)(.*?)\s*(?=\;)", url).group(1))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Invalid \uXXXX escape: line 1 column 20235 (char 20235)
我该如何修复它,或者也许还有另一种方法来获取有效的 JSON(最好使用 native 库)?
最佳答案
您的正则表达式可能已找到 char ';'在响应中间的某个位置,因此您会收到错误,因为使用正则表达式,您可能收到不完整的、经过裁剪的响应,这就是您无法将其转换为 JSON 的原因。
是的,我同意用户 RickyA 的观点,有时使用 native 工具,代码比尝试编写正则表达式更容易阅读。但在这里,我宁愿使用正则表达式,如下所示:
data = re.search(r'(?=\[)(.*?)[\;]*$', response).group(1)
/(?=\[)(.*?)[\;]*$/ (?=\[) Positive Lookahead \[ Literal [ 1st Capturing group (.*?) . 0 to infinite times [lazy] Any character (except newline) Char class [\;] 0 to infinite times [greedy] matches: \; The character ; $ End of string
我相信您的意思是变量“url”表示来自服务器的响应,那么最好使用变量“response”的名称而不是“>网址'。
而且,如果您在使用 RegEx 时遇到一些问题,我建议您使用正则表达式编辑器,例如 RegEx 101 .这是在线正则表达式编辑器,它对输入的每 block 表达式进行解释。
关于python - 从字符串中获取有效的 python 列表(javascript 数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18615524/