我试图获得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)
标题输出只是[],为什么?
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)
| 归档时间: |
|
| 查看次数: |
2011 次 |
| 最近记录: |