在XPATH中从Javascript中的对象中检索值

时间:2018-05-14 06:20:07

标签: html xpath xidel

我需要从HTML文件中提取信息。对于大多数人来说,我只需要匹配特定DOM元素的内容或属性,因此我使用XPATH表达式,如//a[@class="targeturl"]/@href和命令行工具xidel

在不同批次的文件中,我想要的信息位于script,不太容易获得:

<html>
<head><!-- ... --></head>
<body>
    ...
    <script>
        ...
        var o = {
            "numeric": 1234,
            "target": "TARGET",
            "urls": "http://example.com",
            // Commented pair "strings": "...",
            "arrays": [
               {
                  "more": true
               }
               ,
               { 
                  "itgoeson": true
               }
            ]
        };
    </script>
    ...
</body>
</html>

请注意,包含我想要获取的值的对象不是有效的JSON。但是,它似乎每行都要尊重一个键值对。

我可以传递给xidel --xpath "???"以获取此TARGET的内容?

我尝试过与XPATH功能不同的东西,但是我无法找到解决方案而没有管道其他命令(match告诉我是/否,replace正常工作线......等。

2 个答案:

答案 0 :(得分:1)

尝试在XPath下面实现:

substring-before(substring-after(//script, '"target": '), ",")

答案 1 :(得分:1)

  

我可以传递给xidel --xpath "???"以获取此TARGET

由于var o实际上是JSON,我建议你这样对待:

-e "json(
      //script/extract(
        .,
        'var o = (.+);',
        1,'s'
      )[.]
    )/target"
  • {"field1": 1234, "target": "TARGET", "morefields": "..."}元素节点中提取<script>(json包含多行,因此请勿忘记's'正则表达式标记。)
  • 将输出解释为json,将json( )包裹在其周围(或//script/...[.] ! json(.))并选择target属性。

<强> [编辑]
要删除评论(以//开头):

-e "json(
      //script/replace(
        extract(
          .,
          'var o = (.+);',
          1,'s'
        )[.],
        '\s+//.+',
        ''
      )
    )/target"

不是最讨人喜欢的查询,但它确实有效 的 [/编辑]