2013-02-25 80 views
0

我在使用Ruby與Nokogiri拼寫一個網站。將HTML格式化爲CSV

此腳本創建本地文本文件,打開URL並在滿足表達式tr td時寫入文件。它工作正常。

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

DOC_URL_FILE = "doc.csv" 

url = "http://www.SuperSecretWebSite.com" 

data = Nokogiri::HTML(open(url)) 


all_data = data.xpath('//tr/td').text 

File.open(DOC_URL_FILE, 'w'){|file| file.write all_data} 

每行有五個字段,我想水平運行,然後在五個單元格填充後轉到下一行。數據全部存在但不可用。

我希望學習或有人知道如何創建一個CSV格式的代碼,獲取代碼:

  1. 當腳本讀取代碼,傾倒每一個新的TD/TD X5到自己的細胞水平。
  2. 轉到下一行等

的HTML的佈局是:

<tr> 
    <td>John Smith</td> 
    <td>I live here 123</td> 
    <td>phone ###</td> 
    <td>Birthday</td> 
    <td>Other Data</td> 
</tr> 

最終產品應該是什麼樣子。

http://picpaste.com/pics/Screenshot-KRnqRGrP.1361813552.png 

電流輸出

john Smith  I live here 123 phone ### Birthday Other Data, 
+1

你是什麼意思的「不可用」?你能分享你目前的輸出是什麼樣子嗎?此外,將您的目標顯示爲文本文件會有所幫助(它在Excel中的外觀沒有多大幫助)。另外,如果網站不屬於您的網站,請注意這類工作,根據您的法律,這可能是被禁止的(至少用於商業用途)。 – Martin 2013-02-25 17:36:40

+0

本網站提供的信息向公衆開放。這五個字段是任意的,與我所放下的內容沒有任何關係。例如,我使用數字/文本的領域的目的和動態。 – Duck1337 2013-02-25 17:44:35

回答

5

這是非常標準的代碼行走一個表,並提取其細胞成陣列的陣列。您在這一點上對數據的處理取決於您,但將它傳遞給CSV非常容易。

require 'nokogiri' 
require 'pp' 

doc = Nokogiri::HTML(<<EOT) 
<table> 
    <tr> 
    <td>John Smith</td> 
    <td>I live here 123</td> 
    <td>phone ###</td> 
    <td>Birthday</td> 
    <td>Other Data</td> 
    </tr> 
    <tr> 
    <td>John Smyth</td> 
    <td>I live here 456</td> 
    <td>phone ###</td> 
    <td>Birthday</td> 
    <td>Other Data</td> 
    </tr> 
</table> 
EOT 

data = [] 
doc.at('table').search('tr').each do |tr| 
    data << tr.search('td').map(&:text) 
end 

pp data 

,其輸出:

[["John Smith", "I live here 123", "phone ###", "Birthday", "Other Data"], 
["John Smyth", "I live here 456", "phone ###", "Birthday", "Other Data"]] 

該代碼使用search使用at定位第一<table>,然後經各個<tr>迭代。對於每一行,它遍歷單元格並提取它們的文本。

Nokogiri的at找到第一個出現的東西,並返回一個節點。 search查找所有匹配項並返回一個NodeSet,它的作用類似於一個數組。爲了簡單起見,我使用CSS訪問器而不是XPath。


作爲FYI:

File.open(DOC_URL_FILE, 'w'){|file| file.write all_data} 

可以更簡潔地寫爲:

File.write(DOC_URL_FILE, all_data) 

我一直在這個問題上一段時間。你能給我更多的幫助嗎?

唉...

你看了CSV文件,特別是例子嗎?

CSV.open("path/to/file.csv", "wb") do |data| 

,並與CSV塊包裹循環,如:

CSV.open("path/to/file.csv", "wb") do |data| 
    doc.at('table').search('tr').each do |tr| 
    data << tr.search('td').map(&:text) 
    end 
end 

那不是測試,但它就是這麼簡單,如果,而不是定義data = []我們,取而代之的是會發生什麼。去擺弄那個。

+0

這就是完美!但它只在終端中發佈格式,而不是輸出文件。什麼是將其導出爲文本文件或CSV文件的正確方法?當我將它轉儲到文本文件或csv時,我沒有獲得格式。 EX:「File.open(DOC_URL_FILE,'w'){| file | file.write data}」這給了我「約翰史密斯我住在這裏123電話###生日其他數據,」 – Duck1337 2013-02-25 19:14:12

+2

我不會寫爲您提供完整的解決方案。閱讀[CSV文檔](http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html),它很好地闡述了它。您只需要弄清楚如何以及在哪裏正確打開CSV文件並更改我的代碼中的變量。順便說一下,你的示例輸出不是CSV,它是僞柱狀的,對於數據加載根本不起作用。 – 2013-02-25 20:05:59

+0

感謝您的鏈接。我會重新閱讀它。有沒有其他信息可以幫助我? – Duck1337 2013-02-25 20:34:29