2012-04-07 93 views
0

我想從表http://www.amiriconstruction.co.uk/goodwoodgolf/scoretable.htm中將文本從Mac OS X命令行中以純文本形式提取爲無紡織品。從HTML中提取文本表

我嘗試了很多sed命令,但sed只會再次打印整個文件。我究竟做錯了什麼?

的是我的嘗試

sed -n '/<tr>/,/<\/tr>/p' scoretable.htm(將只打印表格內容用html標籤:()

+0

你看相關的問題([1](HTTP: //stackoverflow.com/questions/6854586/提取數據從html表與bash腳本),[2](http://stackoverflow.com/questions/10053793/how-can-i-extract-td-from-html-in-bash )等)? – 2012-04-07 14:56:52

回答

2

小TXR網頁抓取,隨着wget幫助搶頁:

@(deffilter nobr ("<br />" "")) 
@(deffilter brsp ("<br />" " ")) 
@(deffilter nosp (" " "")) 
@(next "!wget 2>/dev/null -O - http://www.amiriconstruction.co.uk/goodwoodgolf/scoretable.htm") 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
@(skip) 
<div class="scoreTableArea"> 
@(collect) 
<h2 class="unify">@year - @event</h2> 
@ (filter brsp event) 
@ (collect) 
<tr> 
<td class="center">@pos</td> 
<td>@player</td> 
<td>@company</td> 
<td>@date</td> 
<td class="center">@points</td> 
</tr> 
@ (filter nobr player company date points) 
@ (filter nosp pos points) 
@ (until) 
</tbody> 
@ (end) 
@(end) 
@(output :filter :from_html) 
@ (repeat) 

Event: @event 
Year: @year 

DATE  POS PT PLAYER   COMPANY 
@ (repeat) 
@{date -10} @{pos -2} @{points 2} @{player 16} @company 
@ (end) 
@ (end) 

@(end) 

採樣運行:

$ txr scoretable.txr 

Event: Teeing off to Clobber Ken 
Year: 2011 

DATE  POS PT PLAYER   COMPANY 
Sept 2011 1 40 John Durrant  King Sumners Partnership 
Sept 2011 2 34 Grahame Pettit Amiri Construction 
    Oct 2011 3 31 Tony Deacon  Gleeds 
    Oct 2011 4 29 Tony Boyle  Lacey Hickey Caley 
    Oct 2011 5 29 Richard Hemming Scott White and Hookins 
Sept 2011 6 29 Ian McCoy  Selway Joyce 
June 2011 7 27 Julian Larkin C&G Properties 
Sept 2011 8 25 Roque Menezes Capita Symonds 
June 2011 9 22 Shawn Lambert PWP Architects 
Sept 2011 10 22 Kevin Lendon  Amiri Construction 

Event: Ken Watson (HNW Architects) Undisputed Amiri Golf Demon of the Downs 
Year: 2010 

DATE  POS PT PLAYER   COMPANY 
     2010 1 40 Ken Watson  HNW Architects 
     2010 2 37 David Heda  London Clancy 
     2010 3 34 Gordon Brown  Currie & Brown 
     2010 4 32 Alistair Taylor Wildbrook Properties 
       5 30 Andy Goodridge City Estates 
       6 25 Russ Pitman  Henderson Green 
       7 24 Phil Piper  Piper Whitlock 
       8 23 Kevin Miller  Urban Pulse Architects 
       9 19 Simon Asquith Godsall Arnold Partnership 
       10 19 Shawn Lambert PWP Architects 
       11 18 Martin Judd  Davis Langdon 
+0

請注意,HTML中的「 」正被轉換爲「U + 00A0」空間。 – Kaz 2012-04-07 15:52:19

+0

最好包含TXR下載鏈接。祝你們好運。 – shellter 2012-04-07 22:18:45

+0

+1使用txr;正確的工作的正確工具。 – Sorpigal 2012-04-09 10:24:53

0
sed -n 's;</\?td>;;gp' scoretable.html | \ 
sed -e 's;<td class="center">;;' \ 
    -e 's;<.*>;;' 

請注意,我使用;而不是/作爲我的分隔符 - 我覺得它更容易閱讀。 Sed會使用你在's作爲分隔符後放置的任何字符。

好的,現在解釋一下。第一行:

-n將壓制輸出,但命令末尾的p告訴sed專門打印所有與該模式匹配的行。這將使我們只有包裹在<td>標籤中的行。同時,我發現任何與</\?td>相匹配的東西,並且什麼都不代替。 /\?意味着/不能出現或只出現一次,所以這將匹配開始和結束標籤。末尾的g或全局意味着它不會停止嘗試匹配第一次排成一行後的模式。沒有g它只會替換開始標籤。

從這個輸出被管道輸送到第二行再次sed的:

-e只是指定有一個編輯命令來運行。如果你只是運行一個命令,那麼我就運行兩個命令(下一個命令在第三行)。

這消除<td class="center">,下一行刪除任何其他標記(在這種情況下<br>標籤。

如果你確定有最多隻有一個標籤上一行的最後一個命令只能運行否則,.*將貪婪的比賽太多,所以在:

<td class="center">24 </ br> 

它會匹配整行,並刪除一切