当我尝试Date.parse日期时,我如何传递一个不是日期的字符串?

时间:2016-05-28 03:00:14

标签: ruby nokogiri

我正在抓取一个网站,并且我试图获取例如图书发布日期的日期。该网站并不总是为每本书提供日期,我有时会看到"没有日期"," ????","尚未发布"等等。如果我尝试运行下面的内容并且没有出错,我怎么能通过呢?我可以运行if声明,但我觉得它会变得混乱。

book = page.css(".date").text
date = Date.parse(book)

3 个答案:

答案 0 :(得分:1)

在Ruby中,我们使用rescue来处理异常:

begin
  date = Date.parse("not a date")
rescue ArgumentError
  date = Date.today
end

p date
# => #<Date: 2016-05-28 ((2457537j,0s,0n),+0s,2299161j)>

在上文中,您还可以将begin块留空,在这种情况下,date将设置为nil。此外,将作业移到街区外更为惯用:

date = begin
  Date.parse("not a date")
rescue ArgumentError
  Date.today
end

您还可以使用rescue作为后缀或修饰符表达式:

date = Date.parse("not a date") rescue Date.today
p date
# => #<Date: 2016-05-28 ((2457537j,0s,0n),+0s,2299161j)>

但请谨慎使用,因为您无法指定例外类型,因此它可能会吞下您不希望的例外情况,这会使调试变得困难。

答案 1 :(得分:1)

您可以改用try catch。

try {
    date = Date.parse(book)
}catch(e){
    // set date as the default value.
}

答案 2 :(得分:1)

chronic gem提供强大的日期解析功能,并且还会处理您遇到的无效格式。

您可以使用以下方式安装:

gem install chronic

或在Gemfile

gem "chronic"

您可以像这样解析示例中的日期:

book = page.css(".date").text
date = Chronic.parse(book)

如果日期无效,Chronic将返回nil。然后,您所要做的就是确保您的代码nil - 知道;处理无效日期的任何解决方案都必须nil - 知晓,因此此要求并非Chronic专有。

慢性宝石暂时没有更新,但它仍然具有相关性。它涵盖了日期解析的大量内容,您可以在一段时间内使用它作为报价。例如,您可以找到各种格式的日期(例如,&#39; 12/13/99&#39;,&#39; 2002-10-04&#39;,&#39; 2007年5月13日&#39 ;),而Chronic处理那些没有出汗的人。默认情况下,Ruby Date解析器仅支持有限数量的格式,您必须围绕它构建自定义代码,以使其了解更多日期格式。

Ruby: List DateTime Format Options的已接受答案中,我展示了如何实现和使用DateParser类,该类还缓存结果以提高性能;这值得一读,因为在这种情况下肯定有帮助。