我想了解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 "-----------------------------"
})
标题输出只是[]
,为什么?
答案 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
如果您想使用比此更复杂的内容,请使用nokogiri
或mechanize
。感谢