我有一段看起来像这样的代码:
def create_page_object(url)
begin
page = Nokogiri::HTML(open(url))
rescue
puts "page not loaded"
end
end
然后我通过以下方式调用它:
result.each do |url|
page = create_page_object(url)
content = make_content(page)
end
现在,在终端中我看到“页面未加载”然后Ruby炸毁了我。我该怎么说,“如果页面未加载,请停止并转到下一个项目。”
的更新 的
爆炸的科学定义:
test.rb:70:in `get_title': undefined method `xpath' for nil:NilClass (NoMethodError)
from test.rb:40:in `block (2 levels) in process'
from test.rb:35:in `each'
from test.rb:35:in `block in process'
from test.rb:32:in `upto'
from test.rb:32:in `process'
from test.rb:138:in `<main>'
我认为发生的事情是因为没有加载,没有页面变量设置,这是nil并且被抛入make_content函数。
答案 0 :(得分:2)
救援区正在返回puts
的输出(nil
),您必须确保在使用之前有文档。另请注意,在救援中您应该显式返回nil
以明确该分支中返回的方法是什么。我写道:
def create_page_object(url)
begin
page = Nokogiri::HTML(open(url))
rescue
puts "page not loaded"
nil
end
end
result.each do |url|
if (page = create_page_object(url))
content = make_content(page)
end
end
我不知道你的具体需求,但做“先发制人”救援通常是个坏主意。当你有一些有用的东西可以拯救,否则你就会阻止更高的等级。
答案 1 :(得分:2)
有很多方法可以解决这个问题,所以这是另一种方法:
def create_page_object(url)
begin
page = Nokogiri::HTML(open(url))
yield page
rescue
puts "page not loaded"
end
end
result.each do |url|
create_page_object(url) { |page| content = make_content(page) }
end
但是如果您需要在区块之外的content
:
content = nil
result.each do |url|
create_page_object(url) { |page| content = make_content(page) }
end
或者您可以在块中添加更多content
处理逻辑:
result.each do |url|
create_page_object(url) do |page|
content = make_content(page)
# do interesting things with 'content' here
end
end
答案 2 :(得分:1)
这样做的一种方法是在create_page_object(url)中返回nil,如果你必须解救它,如果在Nokogiri :: HTML(open(url)中加载它则返回true)。这样你就可以测试它是否为零,如果是这样的话,可以测试它是否接下来。例如:
def create_page_object(url)
begin
page = Nokogiri::HTML(open(url))
rescue
puts "page not loaded"
return nil
end
end
和
result.each do |url|
page = create_page_object(url)
next if page.nil?
content = make_content(page)
end
我很惊讶&#34; Nokogiri&#34;如果页面没有加载而不是返回一个nil对象,则抛出一个异常,但如果这是它的工作原理,那么这个方法应该为你做。祝你好运。
答案 3 :(得分:1)
试试这个:
def create_page_object(url)
begin
Nokogiri::HTML(open(url))
rescue
puts "page not loaded"
end
end
result.each do |url|
page = create_page_object(url)
next if page.nil?
content = make_content(page)
end
在Ruby中,方法中的最后一个表达式是返回值,因此您可以省略赋值。 puts
方法不返回任何内容,如果抛出异常,您将获得nil
。
答案 4 :(得分:0)
您可以尝试使用“救援OpenURI :: HTTPError =&gt; e”而不仅仅是“救援”。