我正在尝试从服务器的响应中获取有效的python列表,如下所示:
窗口.__ search.list = [{ “顺序”: “1”, “基”: “法”, “N”: “148904”, “访问”:{ “CSS”: “avail_yes”,“标题“:” \ u042 2 \ u0435 \ u043a \ u0441 \ u0442 \ u0434 \ u043e \ u043a \ u0443 \ u043c \ u0435 \ u043d \ u0442 \ u0430 \ u0434 \ u043e \ u0441 \ u0442 \ u0443 \ u043f \ u0435 \ u043d “},” 标题“: “\” \ 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 \ u0444 \ u044e \ u0449 \ u043c \ u0444 \ 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 \ u0444 \ u043e \ u0441 \ u0443 \ u043f \ u0444 \ 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 \ u0444 \ u0441 \ u0441 \ u0444 \ 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'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的方法(使用本机库是可取的)?
答案 0 :(得分: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 '表示来自服务器的响应,然后可能更好地使用变量'响应'的名称而不是'网址”。
而且,如果您在使用RegEx时遇到麻烦,我建议您使用正则表达式的编辑器,如RegEx 101。这是在线正则表达式编辑器,它解释了输入表达式的每个块。 / p>
答案 1 :(得分: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
使用正则表达式看起来像是一个很大的过度杀伤。