2

我正在尝试从服务器的响应中获取有效的 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}\u0443\u043f}\u043d ":"\"\u0410\u0440\u0431\u0438\u0442\u0440\u0430\u0436\u043d\u044b\u0439\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0440\u044\c\u0443\u0430\u 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\u0438\u0437\u04 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.20402 N 95-\u \u0435\u0434. \u043e\u0442 02.07.2013) (\u0441 \u0438\u0437\u043c. \u0438 \u0434\u043e \u043f.,\u0432\u0441\u0442\u0443\u043f\u044\u0440\u 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(最好使用本机库)?

4

2 回答 2

3

可能,您的正则表达式已找到 char ';' 在响应中间的某个地方,因此您会收到一个错误,因为使用您的正则表达式,您可能收到了一个不完整的裁剪响应,这就是您无法将其转换为 JSON 的原因。

是的,我同意用户 RickyA 的观点,即有时使用本地工具,代码比尝试编写 RegEx 更容易阅读。但在这里,我宁愿使用正则表达式,如下所示:

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 '的名称而不是' url '可能更好。

而且,如果您在使用 RegEx 时遇到问题,我建议您使用正则表达式编辑器,例如RegEx 101。这是在线正则表达式编辑器,它解释了输入表达式的每个块。

于 2013-09-08T14:47:54.780 回答
2

关于什么:

response = response.strip() #get rid of whitespaces
response = response[response.find("["):] #trim everything before the first '['
if response[-1:] == ";": #if last char == ";"
    response = response[:-1] #trim it

用正则表达式来做这件事似乎有点矫枉过正。

于 2013-09-04T13:55:51.847 回答