2009-09-18 21 views
1

祝大家:如何使用紅寶石獲取HTML <cite>標籤之間的字符串?

我很想從大量的Google搜索結果頁面中獲取一些信息。 我唯一需要的是一組<cite></cite> HTML標籤中的網址。

我不能得到解決方案,以任何其他正確的方式來處理這個問題,所以現在我正在轉向紅寶石。

這是迄今爲止我已經寫了:(?因爲它錯過了make命令或某事)

require 'net/http' 
require 'uri' 

url=URI.parse('http://www.google.com.au') 
res= Net::HTTP.start(url.host, url.port){|http| 
    http.get('/#hl=en&q=helloworld')} 
puts res.body 

可惜我不能使用推薦的角度來說,Hpricot紅寶石寶石

所以我想堅持用這種方法。

現在,我可以將響應正文作爲字符串獲取,我唯一需要的是檢索ciite中的任何內容(移除我以查看真實名稱:))HTML標記。

我該怎麼做?使用正則表達式?任何人都可以給我一個例子嗎?

+0

你爲什麼不張貼我們如何能幫助解決您的角度來說,Hpricot問題一個問題? – 2009-09-18 02:27:57

回答

2

我認爲這將解決這個問題:

res.scan(/<cite>([^<>]*)<\/cite>/imu).flatten 

# This one to ignore empty tags: 

res.scan(/<cite>([^<>]*)<\/cite>/imu).flatten.select{|x| !x.empty?} 
+0

謝謝! – 2009-09-18 05:26:39

+0

如果引用中包含任何html標記,包括斜體,粗體等,這將會搞砸。如果開始標記具有任何屬性,它也將失敗,但我不知道Google是否曾這樣做過。這是一個替代的正則表達式,它處理這兩種情況:/ (。*?)<\/cite>/imu – 2009-09-18 14:05:31

+1

似乎很有趣,您能否詳細說明「部分?只是爲了記錄... – khelll 2009-09-18 14:20:12

1

將字符串拆分爲所需的標籤。假設只有一個標籤實例(或者只指定一個分割),你將會有兩塊我將稱之爲頭部和尾部。拿尾巴並在結束標記上分割(一次),所以你現在在你的新數組中有兩個部分。新頭是你的標籤之間的內容,新尾是字符串的其餘部分,如果標籤可能出現多次,則可以再次處理。

可能不完全正確的一個例子,但你的想法:

head1, tail1 = str.split('<tag>', 1) # finds the opening tag 
head2, tail2 = tail1.split('</tag>', 1) # finds the closing tag 
+0

掃描比分割好得多... – 2009-09-18 13:53:07

+1

更好用什麼方式? – kajaco 2009-09-20 01:07:32

2

如果您遇到問題的角度來說,Hpricot,你也可以嘗試nokogiri這是非常相似的,並允許你做一樣的東西。

3

下面是做這件事用引入nokogiri:

Nokogiri::HTML(res.body).css("cite").map {|cite| cite.content}