2016-12-01 3 views
1

В одном из моих сценариев я использую urllib2 и BeautifulSoup для анализа HTML-страницы и чтения тега <script>.Разбор Javascript с Python

Это то, что я получаю:

<script> 
var x_data = { 
    logged: logged, 
    lengthcarrousel: 2, 
    products : [ 
     { 
      "serial" : "106541823" 
      ... 
</script> 

Моя цель состоит в том, чтобы прочитать JSON в переменную x_data, и я не знаю, как сделать это правильно. я хотя:

  • Преобразовать в строку и удалить первые символы до {и то же для последнего}
  • Использование регулярных выражений с чем-то вроде и принять первая группа
  • «{*.}» Что-то другое ?

Я не знаю, эффективны ли они и если есть другие способы сделать это красиво.

Как вы думаете, способ предпочтительнее другого? любой метод, о котором я могу не знать?

Заранее благодарю за любой совет.

EDIT:

После консультации я получить решение РегВыр, но я не могу найти в нескольких строках, несмотря на использование re.MULTILINE:

string1 = '<script> 
var x_data = { 
    logged: logged, 
    lengthcarrousel: 2, 
    products : [ 
     { 
       "serial" : "106541823"} 
] 
}; 
</script>' 


p = re.compile(r'\{.*\};',re.MULTILINE); 
m = p.search(string1) 
if m: 
    print m.group(0) 
else: 
    print "Error !" 

Я всегда получал «Ошибка!».

EDIT2:

хорошо работает с re.DOTALL.

+0

https://pypi.org/project/jsonfinder/ –

+0

Зависит от того, как изменяется входной сигнал. Если это всегда будет «var x_data = ...», вы можете просто заменить регулярное выражение на этот бит, привязанный к началу строки. Ваше решение может лежать в любом месте так просто, как сложное, как вложение парсера JS. –

+0

Здравствуйте, всегда будет 'var x_data = ...'. Спасибо, я сейчас напишу regexp-решение. –

ответ

2

Я думаю, что эти методы являются по существу то же самое с точки зрения элегантности и производительности (с использованием {.*} может быть немного лучше, потому что .* жаден, то есть не будет почти не отступает, и потому, что мне кажется более «прощающий» для различных JS код форматирования нюансов). Вас может заинтересовать следующее: https://docs.python.org/3.6/library/json.html.

1

Если это всегда выглядит так, то вы можете взломать решение, подобное тому, которое вы предложили, на его основе, выглядящим именно так.

Поскольку программисты делают все в коде, я подозреваю, что на практике он не будет выглядеть точно таким же образом, и тогда любое хакерское решение будет хрупким и потерпит неудачу при неожиданных (прочитанных «невероятно неудобных») моментах. (Regex, как известно, взломан, когда дело доходит до кода синтаксического анализа).

Если вы хотите сделать это правильно, вам нужно будет получить настоящий парсер JavaScript, примените его к фрагменту кода, определенному содержимым тега скрипта, чтобы получить AST, а затем выполните поиск вложенных структур AST для JavaScript, которые происходят чтобы выглядеть как JSON, и взять содержимое этого дерева, красивое.

Даже это будет хрупким перед программистом, который собирает фрагмент JSON с использованием операторов назначения JavaScript. Вы можете справиться с этим, вычислив поток данных и обнаружив наборы кода, которые возникают для сборки кода JSON. Это довольно много работы.

Итак, вы можете решить, каковы будут пределы вашего решения, а затем принять последствия, если кто-то, кого вы не контролируете, делает что-то случайное.

+0

Ничего себе. Сдвиг. Downvoter, вы готовы объяснить свою причину для downvoting, и, в частности, почему этот ответ неверен? –

+0

Я не спускал вниз, но предполагаю, что если «всегда будет« var x_data = .... »(http://stackoverflow.com/questions/40915646/parsing-javascript-with-python/40915808#comment69043750_40915646) то структура кода должна быть довольно фиксированной. –

+0

Это для ОП, чтобы утверждать и обеспечивать соблюдение в той мере, в какой он может это сделать. Если он действительно сможет обеспечить это, он может безопасно взломать. Я думаю, что это очень плохая ставка. Мой опыт работы с людьми, говорящими мне, что весь их код написан в соответствии с определенным стилем, заключается в том, что люди, которые говорят мне, не те, кто написал код, а просто лгут себе и ко мне, и заставят меня страдать, когда это оказывается ложным. И у меня здесь много опыта. –