繁体   English   中英

如何使用sed,awk或grep从HTML表格单元格中提取数据?

[英]How can I extract data from HTML table cells using sed, awk, or grep?

我有一个cURL Bash脚本,它可以访问网站并发布数据,然后将其返回给文本文件。 文本文件全部以HTML格式返回,我无法弄清楚如何从中提取所需的信息。 这是Info.txt中的HTML:

<table cellspacing="1" cellpadding="0" border="0">
<tr><td><img src="/themes/img/status/green.gif" width="12" height="12" border="0"/></td><td><font class="small"><i>October 15, 2013 @ 1:34pm (PST)</i></font></td></tr>
<tr><td><font class="small">MF:&nbsp;&nbsp;</font></td><td><font class="small">PSVBHP9001230079779201</font></td></tr>
<tr><td><font class="small">SN:&nbsp;&nbsp;</font></td><td><font class="small">1354716309166</font></td></tr>
<tr><td><font class="small">ID:&nbsp;&nbsp;</font></td><td><font class="small">800.10</font></td></tr>
</table>

我需要提取这3个值:

  • PSVBHP9001230079779201
  • 1354716309166
  • 800.10

我用grep尝试了这个,但没有取得多大成功。 我似乎无法弄清楚如何提取我想要的值。 我已经尝试了多个sed和awk命令,但最接近的是我可以使用这个grep命令:

$ grep -o '[^ ]*.PSV[^ ]*' Info.txt
<tr><td><font>PSVBHP9001230079779201</font></td></tr>

解析HTML,不要Grep它

有时,如果符合以下条件,您可以轻松使用HTML:

  1. 你知道输入格式将保持一致,并且
  2. 你的数据非常规律。

您的语料库似乎不符合这些条件,因此请使用HTML或XML解析器来获得最佳结果。

使用Nokogiri

Ruby的Nokogiri gem和XPath选择器可以快速完成这项工作。 例如:

require 'nokogiri'
doc = Nokogiri::HTML(File.read '/tmp/info.txt');
doc.xpath('//td[2]').map(&:content).reject { |e| e.include? ':' }
#=> ["PSVBHP9001230079779201", "1354716309166", "800.10"]

这将从每行中选择第二个单元格,并使用冒号放弃任何结果。 如果您不确定所需的字段是否始终位于第二个单元格中,那么您的语料库也将与此替代正确匹配:

doc.xpath('//td').map(&:content).reject { |e| e.empty? or e.include? ':' }
#=> ["PSVBHP9001230079779201", "1354716309166", "800.10"]

您当然可以调整选择器以匹配对语料库的任何更改,或将结果存储在变量中,以便在解析器返回候选字段后优化结果。 天空是极限,但这应该足以让你开始。

$ awk -F'[<>]' '/<tr><td><font/{print $15}' file
PSVBHP9001230079779201
1354716309166
800.10

使用XML2套件

虽然解析HTML是规范正确的解决方案,但您肯定还有其他选择。 其中一个选项是将HTML转换为平面格式,可以使用您选择的工具进行过滤或拆分。 PYX表示法xml2工具使用的直观但未记录的格式是以线性格式表示HTML文档的两种方法。 对于这个用例,我推荐后者。

扁平化HTML的示例

鉴于您发布的语料库,以下内容将适用于xml2包中的html2实用程序:

$ html2 < /tmp/info.txt | fgrep /td/ | egrep -v '[:@]' | cut -d= -f2
PSVBHP9001230079779201
1354716309166
800.10

这适用于:

  1. 将HTML转换为面向行的表示,
  2. 选择具有固定字符串grep的表格单元格,
  3. 删除包含带有扩展正则表达式的冒号的属性和行,以及
  4. 选择带切割的节点值。

展平HTML显然有点像黑客,配方可能需要额外的过滤以适应您的真实语料库。 另一方面,它在命令行中运行良好,不需要深入了解文档类型定义文档对象模型XPath 它还利用您对sed,grep,awk,cut等核心实用程序的了解。

你的旅费可能会改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM