1

我需要从 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

match我已经用 XPATH 函数尝试了不同的东西,但是如果没有管道到其他命令(告诉我是/否,replace逐行工作......等),我无法找到解决方案。

4

2 回答 2

1

尝试在 XPath 下实现:

substring-before(substring-after(//script, '"target": '), ",")
于 2018-05-14T09:13:54.723 回答
1

我可以通过什么xidel --xpath "???"来得到这个TARGET

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

-e "json(
      //script/extract(
        .,
        'var o = (.+);',
        1,'s'
      )[.]
    )/target"
  • {"field1": 1234, "target": "TARGET", "morefields": "..."}从元素节点中提取<script>(json 包含几行,所以不要忘记's'regex-flag)。
  • json( )通过环绕它(或)将输出解释为 json//script/...[.] ! json(.)并选择target属性。

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

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

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

于 2018-05-14T17:04:50.563 回答