【问题标题】:Retrieve value from object in Javascript in XPATH在 XPATH 中的 Javascript 中从对象中检索值
【发布时间】:2018-05-14 06:20:06
【问题描述】:

我需要从 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 逐行工作......等等)。

【问题讨论】:

    标签: html xpath xidel


    【解决方案1】:

    我可以将什么传递给xidel --xpath "???" 来获得这个TARGET

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

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

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

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

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

    【讨论】:

    • > 既然 var o 实际上是 JSON,我建议你这样对待它 可悲的是,真正的文件并没有真正的 valid JSON 和 @ 987654334@ 解析失败。不过,不错的方法,完整,详细的答案。
    • 那你的这个真实文件到底长什么样子?我之前处理过无效的 JSON。
    • 这个有注释行。毕竟它是 JavaScript,我不能确定其他批次是否会有不带引号的键或其他有问题的语法。我正在用更具代表性的样本更新问题。
    【解决方案2】:

    尝试在XPath下面实现:

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

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多