使用Ruby获取页面标题

dab*_*aba 2 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 "-----------------------------"
})
Run Code Online (Sandbox Code Playgroud)

标题输出只是[],为什么?

Ste*_*fan 8

open返回一个File对象或将其传递给块(实际上是一个Tempfile但无关紧要).调用to_s只返回一个包含对象类及其id的字符串:

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

扫描该字符串的标题显然是无用的:

"#<File:0x007ff8e23bfb68>".scan(/<title>(.*?)<\/title>/)
Run Code Online (Sandbox Code Playgroud)

相反,你必须read得到文件的内容:

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

您现在可以扫描<title>标记的内容:

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

或者,使用Nokogiri :(因为你不能用正则表达式解析[X] HTML)

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