iT邦幫忙

0

網頁資料擷取

請問各位先進
最近我想要用編寫一個shell script 用來擷取機場航班資訊
如本頁面
http://www.tsa.gov.tw/CustomerSet/tsa/tp\_FlightSchedule/u\_fsin\_v.asp?id={FE8E2C05-9D2C-482F-9919-4A3A3387E71A}&AirID=UIA&GoalName=KHH

再將文字流擷取特定欄位後導入網頁,而不是直接用連結
所以我是可以用wget 先擷取之後再用awk做處理?
不過用wget載下的是空白檔,是否遺漏參數
這部份還是新手所以想各位先進解答@@

zanhsieh iT邦新手 4 級 ‧ 2012-04-05 09:38:10 檢舉
1. 個人認為您抓取PDA版比較有效率。HTML要分析的代碼少,錯誤率少點,省點工,傳輸快點。
2. 更快點 (少發一點 Request) 的可以拿 Scrapy (google python scrapy) 練功。

2 個回答

8
逮丸逮丸
iT邦大師 1 級 ‧ 2012-04-05 14:01:02
最佳解答

要處理html的table,
用shell script的相關工具是太辛苦。

也可像zanhsieh建議用刮除HTML的工具,
來截取其中的內容;
這方面也可參閱站上的舊文:
[Reply]用ruby 來刮除不必要的HTML標籤
PHP正規劃過濾Excel轉html的table

以下是用 ruby 透過 hpricot 寫的簡單的 script 的測試過程,
先 wget 該網頁為 fly.html
然後寫一個parse.rb的指令檔:

<pre class="c" name="code">require 'rubygems'
require 'hpricot'
array = []
doc = Hpricot(open('fly.html'))
trs = doc.search('.C-tableA0/tr')
(2..trs.size-1).to_a.each do |i|
  tdarr = []
  trs[i].search('td').each do |td|
    tdarr << td.innerText
  end
  array << tdarr
end
p array

最主要的是上面的第5行
就把所有各行的tr抓到,
第8行就把各td抓成陣列。
最後一行只是印出陣列。
然後執行 ruby parse.rb 即印出array的樣式。

將測試放在Rails上,
controller的內容稍有不同:

<pre class="c" name="code">def chenry
require 'rubygems'
require 'hpricot'
require 'open-uri'
@array = []
#doc = Hpricot(open('fly.html'))
url = 'http://www.tsa.gov.tw/CustomerSet/tsa/tp_FlightSchedule/u_fsin_v.asp?id={FE8E2C05-9D2C-482F-9919-4A3A3387E71A}'
uri = URI.parse(URI.encode(url.strip))
doc = Hpricot(open(uri))
trs = doc.search('.C-tableA0/tr')
(2..trs.size-1).to_a.each do |i|
  tdarr = []
  trs[i].search('td').each do |td|
    tdarr << td.innerText
  end
  @array << tdarr
end
end

而 view 的chenry.html.erb的內容為:
<pre class="c" name="code"><ul>
<% @array.each do |a| -%>
<li><%= a.join('::') -%></li>
<% end -%>
</ul>
<hr />
<%= @array.inspect -%>

就畫成即時的這個 測試
不同程式語言,
都應有類似的處理 HTML 或 DOM 的相關套件,
比單純用 shell script 工具省很多力。

chenry iT邦新手 5 級 ‧ 2012-04-07 21:27:54 檢舉

感謝!有點眉目,繼續嘗試。

6
wiseguy
iT邦超人 1 級 ‧ 2012-04-04 23:54:15

chenry提到:
是否可以用wget 先擷取之後再用awk做處理?

當然可以。

chenry提到:
用wget載下的是空白檔,是否遺漏參數

沒有遺漏。因為我可以用 wget 抓到網頁。我寫的指令是:

&lt;pre class="c" name="code">wget 'http://www.tsa.gov.tw/CustomerSet/tsa/tp_FlightSchedule/u_fsin_v.asp?id={FE8E2C05-9D2C-482F-9919-4A3A3387E71A}&AirID=UIA&GoalName=KHH'

請寫出你下的指令是什麼。

我要發表回答

立即登入回答