使用 Bash 获取一对 HTML 标记之间的内容



我需要使用 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/XML解析。我希望这能给你一些想法:

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

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

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

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

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

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

忘记 Bash 由于它的限制,您可以使用 nokogiri 作为命令行实用程序,如此处所述。

例:

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

另一种选择是使用多平台xidel实用程序(SourceForge上的主页,GitHub存储库),它可以处理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()'

我刚刚发现了一个非常好的 Unix 命令行工具,hq。

我使用Arch-Linux,安装只是pacman -S hq

我的问题是从 html 标头中提取 json-ld,使用 hq 你就可以去了

curl -sSL https://www.example.com | hq '[type="application/ld+json"]' text

考虑使用漂亮的勺子。

从上述.html中选择正文标签:

$ 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>

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

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

相关内容

  • 没有找到相关文章

最新更新