从 XPATH 中 Javascript 中的对象检索值

Retrieve value from object in Javascript in XPATH

我需要从 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 告诉我 yes/no,replace 行行...等)。

尝试在 XPath 下实现:

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

What can I pass to xidel --xpath "???" to get this TARGET?

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

-e "json(
      //script/extract(
        .,
        'var o = (.+);',
        1,'s'
      )[.]
    )/target"
  • <script> 元素节点中提取 {"field1": 1234, "target": "TARGET", "morefields": "..."}(json 包含几行,所以不要忘记 's' 正则表达式标志)。
  • 通过将 json( )(或 //script/...[.] ! json(.))和 select target 属性包装起来,将输出解释为 json。

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

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

不是最漂亮的查询,但它有效。
[/edit]