使用Ruby获取页面标题

时间:2014-11-06 11:56:49

标签: ruby

我想了解title标签内的内容,但我无法做到。我正在关注stackoverflow的一些应该有用的答案,但对我来说他们不会。

这就是我在做的事情:

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 个答案:

答案 0 :(得分:8)

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 :(得分: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。感谢