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

时间:2014-01-09 08:56:56

标签: html bash

我需要使用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>

提前致谢。

6 个答案:

答案 0 :(得分:11)

纯文本处理不适合html / xml解析。我希望这可以给你一些想法:

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

答案 1 :(得分:8)

在shell / bash中使用sed,因此您无需安装其他内容。

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

答案 2 :(得分:8)

我个人认为从包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 

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

答案 3 :(得分:4)

由于存在限制而忘记Bash,您可以使用nokogiri作为命令行util,如here所述。

示例:

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:0)

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

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