1

我有一个 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>

我需要提取这三个值:

  • PSVBHP9001230079779201
  • 1354716309166
  • 800.10

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

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

3 回答 3

1
$ awk -F'[<>]' '/<tr><td><font/{print $15}' file
PSVBHP9001230079779201
1354716309166
800.10
于 2013-10-16T01:09:51.397 回答
1

解析 HTML,不要用 Grep 它

有时,如果出现以下情况,您可以使用 grepping 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"]

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

于 2013-10-16T00:27:29.517 回答
1

使用 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. 用 cut 选择节点值。

扁平化 HTML 显然是一种 hack,而且配方可能需要额外的过滤来适应你的真实语料库。另一方面,它在命令行中运行良好,不需要对文档类型定义文档对象模型XPath有任何深入的了解。它还利用您对 sed、grep、awk、cut 等核心实用程序的了解。

你的旅费可能会改变。

于 2013-10-16T03:29:27.057 回答