我正在抓取一个网站,并且我试图获取例如图书发布日期的日期。该网站并不总是为每本书提供日期,我有时会看到"没有日期"," ????","尚未发布"等等。如果我尝试运行下面的内容并且没有出错,我怎么能通过呢?我可以运行if
声明,但我觉得它会变得混乱。
book = page.css(".date").text
date = Date.parse(book)
答案 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
类,该类还缓存结果以提高性能;这值得一读,因为在这种情况下肯定有帮助。