我需要使用 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 脚本。
前期工作会更多,但从长远来看(这里:一小时后),节省的时间将弥补额外的努力。