2016-12-30 3 views
0

Итак, у меня есть несколько проблем, которые я пытаюсь решить.Разбор javascript с использованием re.findall

Сначала я пытаюсь разобрать этот javascript, который я получил из html.

$ (документ) .ready (функция() { $ ('# товарно-шоу-миниатюра') bxSlider ({режим:. 'Вертикальный', авто: ложные, контроли: правда, пейджер: false, minSlides: 4, maxSlides: 4, moveSlides: 1, slideWidth: 250}); itemSelector ('товар-шоу-форма', 'товар-шоу-addcart-submit', [['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«Синий», «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', 'товар-шоу-образ'); });

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

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

print(final) 

я получил следующий вывод

[[ 'Дымчатый синий/Слюда синий', '36'], [ 'Дымчатый синий/Слюда Blue', '36, 5 '], [' Smokey Blue/Mica Blue ', '37, 5'], ['Smokey Blue/Mica Blue', '38'], ['Smokey Blue/Mica Blue', '38, 5 '], [' Smokey Blue/Mica Blue ',' 39 '], [' Smokey Blue/Mica Blue ',' 40 '], [' Smokey Blue/Mica Blue ', '40, 5'], ['Smokey Blue/Mica Blue', '42' ]]

Но теперь я не знаю, как это сделать. Я хочу найти значение this value 39805 от

{"39805": {"params": ["Smokey Blue/Mica Blue", "36"]}. Как бы я разобрал его так, что если бы я искал значение, связанное с 36, это дало бы мне 39805?

Прошу прощения, но я очень плохо разбираюсь в этом, и я довольно новичок в этом.

+0

Похоже, вы действительно хотите результат парсинга быть Dict как '{39805 ':' 36' , '39807': '37', .. .} 'это правильно? – saulspatz

+0

Вы пытаетесь очистить веб-страницу для контента, созданного JavaScript? –

+0

@saulspatz да. Но вместо того, чтобы иметь весь dict, я думаю о разборе для конкретной ценности. Подобно Parse for value 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

EDIT: Я просто понял, что в некоторых случаях размер имеет два номера, как "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 
Смежные вопросы