2014-11-06 66 views
1

我正在嘗試獲取title標籤中的內容,但我無法完成此操作。我正在遵循一些關於應該工作的stackoverflow的答案,但對我來說他們沒有。使用Ruby獲取頁面標題

這是我在做什麼:

require "open-uri" 
require "uri" 

def browse startpage, depth, block 
    if depth > 0 
     begin 
      open(startpage){ |f| 
       block.call startpage, f 
      } 
     rescue 
      return 
     end 
    end 
end 

browse("https://www.ruby-lang.org/es/", 2, lambda { |page_name, web| 
    puts "Header information:" 
    puts "Title: #{web.to_s.scan(/<title>(.*?)<\/title>/)}" 
    puts "Base URI: #{web.base_uri}" 
    puts "Content Type: #{web.content_type}" 
    puts "Charset: #{web.charset}" 
    puts "-----------------------------" 
}) 

標題輸出只是[],爲什麼呢?

+2

你是不是想用這個只開放-URI嗎?爲什麼不使用Nokogiri? – daremkd 2014-11-06 12:00:55

+0

@daremkd是的,我看到Nokogiri服務於這個目的,但我想這樣做,我想知道爲什麼我得到一個空列表作爲標題。在所有這些解決之後,作爲額外提示的Nokogiri解決方案也可以很好。 – dabadaba 2014-11-06 12:14:45

+1

使用正則表達式來解析HTML標籤是非常令人沮喪的。在任何網頁上可能會有成千上萬的細微差別,可能會導致您的正則表達式無法工作。 – daremkd 2014-11-06 12:16:20

回答

5

open返回一個File對象或將其傳遞給塊(實際上是一個Tempfile但這並不重要)。調用to_s只返回一個包含對象的類及其ID的字符串:

open('https://www.ruby-lang.org/es/') do |f| 
    f.to_s 
end 
#=> "#<File:0x007ff8e23bfb68>" 

掃描該字符串爲標題顯然是無用的:

"#<File:0x007ff8e23bfb68>".scan(/<title>(.*?)<\/title>/) 

相反,你必須read文件的內容:

open('https://www.ruby-lang.org/es/') do |f| 
    f.read 
end 
#=> "<!DOCTYPE html>\n<html>\n...</html>\n" 

您現在可以掃描<title>標記的內容:

open('https://www.ruby-lang.org/es/') do |f| 
    str = f.read 
    str.scan(/<title>(.*?)<\/title>/) 
end 
#=> [["Lenguaje de Programaci\xC3\xB3n Ruby"]] 

,或者使用Nokogiri:(因爲You can't parse [X]HTML with regex

open('https://www.ruby-lang.org/es/') do |f| 
    doc = Nokogiri::HTML(f) 
    doc.at_css('title').text 
end 
#=> "Lenguaje de Programación Ruby" 
1

如果你一定要堅持使用open-uri,這一個班輪比讓你的頁面標題:

2.1.4 :008 > puts open('https://www.ruby-lang.org/es/').read.scan(/<title>(.*?)<\/title>/) 
Lenguaje de Programación Ruby 
=> nil 

如果你想使用的東西比這更復雜,請使用nokogirimechanize。謝謝

+0

'Nokogiri :: HTML(open('https://www.ruby-lang.org/es/')).css('title').text'沒有那麼複雜 – Stefan 2014-11-06 12:34:22

+0

其實我更喜歡我的方式這樣做是因爲使用'URL.extract',我得到絕對形式的鏈接,而不是相對的。隨着Nokogiri我得到'href',我想整個鏈接,因爲該頁面將被處理。然而,你使用open()。read.scan()的解決方案與我所做的相同。 'read'與我正在做的'web.to_s'相同。我仍然有同樣的問題:標題是一個空的列表。 – dabadaba 2014-11-06 12:44:45