提取部分代码并在bash中解析HTML

Pav*_*nik 4 bash html-parsing

我有外部HTML网站,我需要从该网站上的表中提取数据.但是,除了代码中的表格之外,HTML网站的源代码格式错误,所以我无法使用

xmllint --html --xpath <xpath> <file>
Run Code Online (Sandbox Code Playgroud)

因为它在网站上的HTML格式被破坏时无法正常工作.

我的想法是使用curl并删除表格上方和下方的代码.提取表时,代码是干净的,它适合xmllint工具(我可以使用xpath).但是删除匹配项上方的所有内容对shell来说都很具挑战性,你可以在这里看到:Sed没有回溯:一旦它处理了一行,它就完成了. 有没有办法如何从bash中的HTML网站中仅提取表的代码?Suposse,代码有这种结构.

<html>
<head>
</head>
<body>
<p>Lorem ipsum ....</p>
  <table class="my-table">
    <tr>
      <th>Company</th>
      <th>Contact</th>
    </tr>
  </table>
<p>... dolor.</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我需要像这样的输出来正确解析数据:

  <table class="my-table">
    <tr>
      <th>Company</th>
      <th>Contact</th>
    </tr>
  </table>
Run Code Online (Sandbox Code Playgroud)

请不要因为尝试使用bash而给我减去.

Ini*_*ian 11

我将分解我尝试使用的答案,xmllint它支持--html解析html文件的标志

首先,您可以通过解析下面的HTML文件来检查HTML文件的完整性,该文件确认文件是否符合标准,或者如果看到则抛出错误: -

$ xmllint --html YourHTML.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
</head>
<body>
<p>Lorem ipsum ....</p>
  <table class="my-table">
    <tr>
      <th>Company</th>
      <th>Contact</th>
    </tr>
  </table>
<p>... dolor.</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我的原始YourHTML.html文件只是你问题中的输入HTML文件.

现在为价值提取部分: -

启动文件解析从根节点到table节点(//html/body/table)并xmllint在HTML解析器和交互式shell模式下运行(xmllint --html --shell)

明确地运行命令会产生结果,

$ echo "cat //html/body/table" |  xmllint --html --shell YourHTML.html
/ >  -------
<table class="my-table">
    <tr>
      <th>Company</th>
      <th>Contact</th>
    </tr>
  </table>
/ > 
Run Code Online (Sandbox Code Playgroud)

现在使用sedie sed '/^\/ >/d'产生删除特殊字符

$ echo "cat //html/body/table" |  xmllint --html --shell YourHTML.html | sed '/^\/ >/d'
<table class="my-table">
    <tr>
      <th>Company</th>
      <th>Contact</th>
    </tr>
  </table>
Run Code Online (Sandbox Code Playgroud)

这是你期望的输出结构.经过测试xmllint: using libxml version 20900

我将再向前迈一步,如果你想获取table标签中的值,你可以应用sed命令将它们提取为

$ echo "cat //html/body/table" |  xmllint --html --shell YourHTML.html | sed '/^\/ >/d' | sed 's/<[^>]*.//g' | xargs
Company Contact
Run Code Online (Sandbox Code Playgroud)