2011-12-26 4 views
1

мне нужно, чтобы захватить значения в JSON строки, хранящейся внутри функции в теге сценария, как это:Как разобрать скребковую строку JSON

<script type="text/javascript"> 
    my.function("bar", {"foo1": false, "foo2": true, "foo3": "foobar!"}); 
</script> 

я могу добраться до определенного тега, используя Mechanize следующим образом:

parser.xpath("//script[ contains(text(), 'my.function')]").text 

, но я не уверен, как это сделать дальше. Как я могу извлечь часть JSON строки и преобразовать ее в хеш, чтобы я мог извлечь значения?

ответ

1

Если форма не меняется, вы можете сделать

JSON.parse(/\{.*\}/.match(txt)[0]) 

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

+0

именно то, что мне было нужно, спасибо! – David

2

Вот это чистый XPath 1.0 решение:

Применение:

concat('{', 
     substring-before(
       substring-after(
        substring-after(., 'my.function('), 
        '{' 
           ), 
       ');' 
         ) 
     ) 

XSLT - на основе проверки:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "concat('{', 
      substring-before(
        substring-after(
         substring-after(., 'my.function('), 
         '{' 
            ), 
        ');' 
          ) 
      ) 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

, когда это преобразование применяется напредоставленный XML документ:

<script type="text/javascript"> 
my.function("bar", {"foo1": false, "foo2": true, "foo3": "foobar!"}); 
</script> 

выражение XPath (выше) вычисляется и результат выводится:

{"foo1": false, "foo2": true, "foo3": "foobar!"} 
+0

Очень приятно. Это лучше, чем принятое решение. – pguardiario

Смежные вопросы