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

Joa*_*oao 11 html bash

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

<html>
<head>
</head>
<body>
 text
  <div>
  text2
    <div>
        text3
    </div>
  </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

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

 text
  <div>
  text2
    <div>
    text3
    </div>
  </div>
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Ken*_*ent 12

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

kent$  xmllint --xpath "//body" f.html 
<body>
 text
  <div>
  text2
    <div>
        text3
    </div>
  </div>
</body>
Run Code Online (Sandbox Code Playgroud)

  • 尼斯; 仅提取body元素的*content*为X [HT] ML,使用`xmllint --xpath'// body/node()'f.html`. (3认同)
  • 请注意,HTML通常不是有效的XML。在这种情况下,可以使用[Beautiful Soup](http://www.crummy.com/software/BeautifulSoup/)或jtidy之类的工具来清理HTML。 (2认同)

BMW*_*BMW 10

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

tag=body
sed -n "/<$tag>/,/<\/$tag>/p" file
Run Code Online (Sandbox Code Playgroud)


Cro*_*max 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 
Run Code Online (Sandbox Code Playgroud)

得到你需要的东西.干净利落.


mkl*_*nt0 5

另一种选择是使用多平台xidel实用程序(SourceForge 主页GitHub 存储库),它可以处理 XML 和 HTML:

xidel -s in.html -e '/html/body/node()' --printed-node-format=html
Run Code Online (Sandbox Code Playgroud)

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

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

xidel -s in.html -e '/html/body/inner-html()'
Run Code Online (Sandbox Code Playgroud)


Pau*_*lgo 5

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

例子:

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