我用regexp完成了这个解析 massive_string,你可以在这里找到:CALLBACK
Result = re.findall(r"\{\"catalogItemId\"\:.*\}", massive_string)
修剪结果为列表类型,如下所示:
['{"catalogItemId":"7549510","businessCatalogItemId":"950691","name":"Linen Full-Zip Sweater Jacket","catalogItemTypeId":"3","catalogItemSubtypeId":"13","isInStock":"true","inventoryStatusId":"0","sizeCategoryId":"0","defaultVariantId":"2","productStyleVariantList":[{"variantId":"1","variantName":"Regular","productStyleColors":[{"catalogItemId":"7549593"
# ... some Stuff here ...
"hasAlternateImage":"false","hasCrossSell":"false","hasFitAttributeOverlayImages":"false","hasMergeVariants":"false","hasSplitVariants":"false","isGiftCard":"false","isImported":"true","careInstructionText":"Hand wash or dry clean.","flammableWarningText":"","marketingFlag":{"marketingFlagFormatId":"1","marketingFlagId":"102077","marketingFlagTypeId":"1","marketingFlagName":"Available in XS-XXL & Tall Online"},"onlyAvailableOnline":"false"},"localeInfo":{"supportedLocales":"en_US","responseLocale":"en_US"}}}']
所以我需要做类似的事情:
for i in Result:
json.loads(i)
我得到了:
ValueError: Extra data: line 1 column 21264 - line 1 column 21333 (char 21263 - 21332)
如何找到所有需要的catalogItemId
并使用其参数为每个catalogItemId
构建个人JSON,以及如何修复json.loads()
例外。
答案 0 :(得分:1)
问题的解决方案实际上是删除了您要查询的网址的callback
参数:
>>> import requests
>>> data = requests.get('http://m.bananarepublic.gap.com/gmo/product?shopid=2&pid=950691012®ion=us&cid=5343&clientid=SKAVA').json()
>>>
这样,您就不必对JSON数据进行杂乱的解析。回调参数只是一个可选的javascript技巧,用于调用现有函数,该函数将在接收到JSON时解析数据。正如您将在下一个示例中看到的那样,我使用参数callback=foo
来更改生成的json中的回调名称。
最终,问题是你不能只删除删除字符串回调部分所需的内容,但是你试图匹配字符串中的数据:
>>> s = requests.get('http://m.bananarepublic.gap.com/gmo/product?shopid=2&pid=950691012&callback=foo®ion=us&cid=5343&clientid=SKAVA').text
>>> s[0:60]
u'foo({"parentDivisionId":"5343","avgRating":0.0,"numRaters":0'
因此,当您使用贪婪的正则表达式运算符时:
r"\{\"catalogItemId\"\:.*\}"
你最终解析了字符串中不均匀数量的括号,最终得到的只是JSON。因为它匹配:
{"catalogItemId":foobar}
但也是:
{"catalogItemId":"foobar"}, {"foo":"bar"}, {"foo":"bar"}},{"otherDataSet":{"catalogItemId":"barfoo"}}}}
^ ^
`----------------------- matching between those two brackets: ----------------------------------------`
这是无效的JSON。要了解正则表达式的工作原理,请查看this demo:
您应该使用替换正则表达式删除回调,例如:
r"s/foo(\(.*\));/\1/"
贪婪的操作符将按照我们希望的方式工作:一切都到最后一个。