【问题标题】:Get content between a pair of HTML tags using Bash使用 Bash 在一对 HTML 标记之间获取内容
【发布时间】:2022-05-15 06:17:34
【问题描述】:

我需要使用 bash 脚本获取一对给定标签之间的 HTML 内容。 例如,具有以下 HTML 代码:

<html>
<head>
</head>
<body>
 text
  <div>
  text2
    <div>
        text3
    </div>
  </div>
</body>
</html>

使用 bash 命令/脚本,给定 body 标签,我们会得到:

 text
  <div>
  text2
    <div>
    text3
    </div>
  </div>

提前致谢。

【问题讨论】:

    标签: html bash


    【解决方案1】:

    纯文本处理不利于 html/xml 解析。我希望这能给你一些想法:

    kent$  xmllint --xpath "//body" f.html 
    <body>
     text
      <div>
      text2
        <div>
            text3
        </div>
      </div>
    </body>
    

    【讨论】:

    • 请注意,HTML 通常不是有效的 XML。如果是这种情况,您可以使用 Beautiful Soup 或 jtidy 之类的工具来清理 HTML。
    • 不错;要仅将 body 元素的 content 提取为 X[HT]ML,请使用 xmllint --xpath '//body/node()' f.html
    • 嗨,这正是我要找的,你能帮帮我吗——因为可能有很多&lt;div&gt;,如何指定具有类属性的标签,例如&lt;div class="row content-wrapper"&gt; give me this content and this tag in a file&lt;\div&gt; - 并将其写入a newfile withOrignalNameUpdate.nextExtension 我试过这个--output file 但不知道如何获取原始文件名,你能不能把它更新为我们可以运行的文件
    【解决方案2】:

    在 shell/bash 中使用 sed,所以你不需要安装其他东西。

    tag=body
    sed -n "/<$tag>/,/<\/$tag>/p" file
    

    【讨论】:

    • 很好,但是 OP 想要排除开始和结束标签;在最简单的情况下 - 假设每个标签都在单独的行上 - 您可以通过管道传输到 ... | sed '1d;$d'
    • 我是逐案做的,不需要猜测什么是不需要的。
    • 这是一个很好的解决方案,实际上标签可以不同,然后我们可以提取任意两个标签之间的部分,例如,` sed -n "/your_app_name/,//p" yourfile.xml` 能够从 your_app_name 行开始提取部分,直到 最接近 ... 部分的末尾,该部分拉出来的正是应用信息
    • 请测试一下。它似乎工作不稳定。
    【解决方案3】:

    我个人觉得使用 html-xml-utils 包中的 hxselect 命令(通常在 hxclean 的帮助下)非常有用。后者修复(有时损坏)HTML 文件以更正 XML 文件,第一个允许使用 CSS 选择器来获取您需要的节点。通过使用-c 选项,它会去除周围的标签。所有这些命令都适用于标准输入和标准输出。所以在你的情况下你应该执行:

    $ hxselect -c body <<HTML
      <html>
      <head>
      </head>
      <body>
        text
        <div>
          text2
          <div>
            text3
          </div>
        </div>
      </body>
      </html>
      HTML 
    

    得到你需要的东西。简单明了。

    【讨论】:

      【解决方案4】:

      忘记 Bash 由于它的限制,您可以使用 nokogiri 作为命令行工具,如 here 解释。

      例子:

      curl -s http://example.com/ | nokogiri -e 'puts $_.search('\''a'\'')'
      

      【讨论】:

        【解决方案5】:

        另一种选择是使用多平台 xidel 实用程序(home page on SourceForgeGitHub repository),它可以同时处理 XML 和 HTML:

        xidel -s in.html -e '/html/body/node()' --printed-node-format=html
        

        上面打印了带有语法突出显示(彩色)的结果 HTML,并且在 text 节点之后似乎有一个空行。

        如果您只想要文本,Reino 指出您可以简化为:

        xidel -s in.html -e '/html/body/inner-html()'
        

        【讨论】:

        • 太棒了。 Arch 用户也可以在 AUR 上使用。
        【解决方案6】:

        考虑使用beautifulspoon

        从上面的.html中选择body标签:

        $ beautifulspoon example.html --select body
        <body>
         text
         <div>
          text2
          <div>
           text3
          </div>
         </div>
        </body>
        

        然后解开标签:

        $ beautifulspoon example.html --select body |beautifulspoon --select body --unwrap
        text
        <div>
         text2
         <div>
          text3
         </div>
        </div>
        

        【讨论】:

          【解决方案7】:

          BASH 可能是错误的工具。尝试使用强大的Beautiful Soup 库代替 Python 脚本。

          这将是更多的前期工作,但从长远来看(这里:一小时后),节省的时间将弥补额外的努力。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-20
            • 1970-01-01
            • 1970-01-01
            • 2020-11-28
            • 2023-03-14
            • 2012-11-06
            • 1970-01-01
            • 2015-01-04
            相关资源
            最近更新 更多