簡體   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