2016-12-30 114 views
0

所以我有几个问题,我正试图解决。使用re.findall解析javascript

首先我想解析这个javascript我从html获得。

$(文件)。就绪(函数(){ $( '#商品展缩览图')bxSlider({模式: '垂直',自动: 假,控制:真,寻呼机: false,minSlides:4,maxSlides:4, moveSlides:1,slideWidth:250}); itemSelector('commodity-show-form','commodity-show-addcart-submit', [['color','选择颜色'],['尺寸','选择尺寸']],{“39805”:{“Smokey Blue/Mica Blue”,“36”]},“39806”:{“params “:”Smokey Blue/Mica Blue“,”36,5“]},”39807“:{”params“:[”Smokey Blue/Mica Blue“,”37,5“]},”39808“ :{“params”:[“Smokey Blue/Mica 蓝色“,”38“]},”39809“:{”params“:[”Smokey Blue/Mica Blue“, ”38,5“]},”39810“:{”params“/Mica Blue“,”39“]}, ”39811“:{”params“:[”Smokey Blue/Mica Blue“,”40“]},”39812“:{”Smokey Blue/Mica Blue“,”40,5“]},”39814“:{”params“: [”Smokey Blue/Mica Blue“,”42“]}}, [39805,39806,39807,39808,39809 ,39810,39811,39812,39814],'主推车', 'commodity-show-image'); });

res = re.findall(r'{ "params": (.+?)}', text) # text is where javascript text is stored 

final = [eval(i) for i in res] 

print(final) 

我得到以下输出

[[ '烟熏蓝/蓝云母', '36'],[ '烟熏蓝/蓝云母','36,5 '],['烟熏蓝/云母蓝','37,5'],['Smokey Blue/Mica Blue','38'],['Smokey Blue/Mica Blue','38,5'],['Smokey Blue/Mica Blue ['Smokey Blue/Mica Blue','40'],['Smokey Blue/Mica Blue','40,5'],['Smokey Blue/Mica Blue','42' ]]

但现在我不知道该怎么走,从这里开始。我想从

找到这个值39805 10

{“39805”:{“params”:[“Smokey Blue/Mica Blue”,“36”]}。我如何解析它,以便说如果我正在寻找与36相关的价值,它会给我39805?

我很抱歉,但我真的很糟糕的解析,我对此很新。

+0

好像你真的想要解析的结果,要像一个字典'{39805 ':' 36' , '39807': '37',.. 。'是对的吗? – saulspatz

+0

你想抓取一个由JavaScript生成的内容的网页? –

+0

@saulspatz是的。但是,我并没有完整的词典,而是在考虑解析特定的价值。像解析值为36并获得它的值,39805 – b0baboi

回答

0

你可以得到36这样的:

import re 
import ast 

a="""$(document).ready(function() { $('#commodity-show-thumbnails').bxSlider({ mode: 'vertical', auto: false, controls: true, pager: false, minSlides: 4, maxSlides: 4, moveSlides: 1, slideWidth: 250 }); itemSelector('commodity-show-form', 'commodity-show-addcart-submit', [['color', 'Choose color'], ['size', 'Choose size']], { "39805": { "params": ["Smokey Blue/Mica Blue", "36"]}, "39806": { "params": ["Smokey Blue/Mica Blue", "36,5"]}, "39807": { "params": ["Smokey Blue/Mica Blue", "37,5"]}, "39808": { "params": ["Smokey Blue/Mica Blue", "38"]}, "39809": { "params": ["Smokey Blue/Mica Blue", "38,5"]}, "39810": { "params": ["Smokey Blue/Mica Blue", "39"]}, "39811": { "params": ["Smokey Blue/Mica Blue", "40"]}, "39812": { "params": ["Smokey Blue/Mica Blue", "40,5"]}, "39814": { "params": ["Smokey Blue/Mica Blue", "42"]} }, [39805,39806,39807,39808,39809,39810,39811,39812,39814], 'main-cart', 'commodity-show-image'); });""" 
b = re.findall(r'.*?({ ".*?} }).*}', a)[0] 

d1 = ast.literal_eval(b) 
print d1, '\n' 

for a,b in d1.iteritems(): 
    if b['params'][1]=='36': 
     print a 

输出:

{'39809': {'params': ['Smokey Blue/Mica Blue', '38,5']}, '39808': {'params': ['Smokey Blue/Mica Blue', '38']}, '39805': {'params': ['Smokey Blue/Mica Blue', '36']}, '39807': {'params': ['Smokey Blue/Mica Blue', '37,5']}, '39806': {'params': ['Smokey Blue/Mica Blue', '36,5']}, '39812': {'params': ['Smokey Blue/Mica Blue', '40,5']}, '39814': {'params': ['Smokey Blue/Mica Blue', '42']}, '39810': {'params': ['Smokey Blue/Mica Blue', '39']}, '39811': {'params': ['Smokey Blue/Mica Blue', '40']}} 

39805 
+0

我实际上是在寻找价值与36.所以这将是39805 – b0baboi

+0

@ b0baboi修改。现在检查。您可以通过点击'tick'标记来接受答案。 http://meta.stackoverflow.com/a/251399/4082217 – MYGz

0

编辑:我刚刚意识到,在某些情况下,有大小两个号码,如 “36,5” 。我假设这意味着36和一半。不管怎么说,我原来的剧本没有考虑对于这一点,这就是为什么它给了错误的答案这里的,似乎工作修订脚本(这是我不小心没有注意到。):

import re 
text='''$(document).ready(function() { $('#commodity-show-thumbnails').bxSlider({ mode: 'vertical', auto: false, controls: true, pager: false, minSlides: 4, maxSlides: 4, moveSlides: 1, slideWidth: 250 }); itemSelector('commodity-show-form', 'commodity-show-addcart-submit', [['color', 'Choose color'], ['size', 'Choose size']], { "39805": { "params": ["Smokey Blue/Mica Blue", "36"]}, "39806": { "params": ["Smokey Blue/Mica Blue", "36,5"]}, "39807": { "params": ["Smokey Blue/Mica Blue", "37,5"]}, "39808": { "params": ["Smokey Blue/Mica Blue", "38"]}, "39809": { "params": ["Smokey Blue/Mica Blue", "38,5"]}, "39810": { "params": ["Smokey Blue/Mica Blue", "39"]}, "39811": { "params": ["Smokey Blue/Mica Blue", "40"]}, "39812": { "params": ["Smokey Blue/Mica Blue", "40,5"]}, "39814": { "params": ["Smokey Blue/Mica Blue", "42"]} }, [39805,39806,39807,39808,39809,39810,39811,39812,39814], 'main-cart', 'commodity-show-image'); });''' 
pattern = re.compile(r' "([0-9]+).*?params.*?([0-9]+(,5)?)') 

s={b:a for a,b,_ in pattern.findall(text)} 

print(s['36'], s['36,5']) 

现在这个打印39805 39806,这对我来说很合适。

这里的所有数据:

for a in sorted(s):print(a, s[a]) 
36 39805 
36,5 39806 
37,5 39807 
38 39808 
38,5 39809 
39 39810 
40 39811 
40,5 39812 
42 39814