2016-05-28 22 views
1

私はウェブサイトを掻き集めています。私は、例えば書籍発売日の日付を取得しようとしています。サイトでは必ずしも各書籍の日付を提供するとは限らず、「日付なし」、「????」、「まだリリースされていません」などと表示されることがあります。私は以下のようなものを実行しようとしていて、エラーが出ないようにしようとしていると、どうすればそれを渡すことができますか?私はifステートメントを実行することができますが、私はそれが乱雑になると感じています。 RubyでDate.parseに日付を入力しようとしているときに、日付ではない文字列を渡す方法はありますか?

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

答えて

1

chronic gemは、堅牢な日付解析機能を備えており、経験するような無効なフォーマットも処理します。

gem install chronic 

たりGemfile中:あなたがして、それをインストールすることができ

gem "chronic" 

をあなたはそうのようなあなたの例から日付を解析することができます

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

日の場合慢性はnilを返します。次に、あなたのコードがnil-awareであることを確認するだけです。 無効な日付を扱うのソリューションはすべてnilである必要があります。したがって、この要件は慢性的ではありません。

慢性宝石はしばらく更新されていませんが、まだ関連性があります。それは、あなたがしばらく見積もりの​​ためにそれを使用することができるように日付の解析と非常に多くの地面をカバーしています。たとえば、さまざまな形式の日付(たとえば、'12/13/99 '、' 2002-10-04 '、' 2007年5月13日 ')を見つけることができます。 Ruby Dateパーサは、デフォルトでは限られた数のフォーマットしかサポートしていないため、より多くの日付フォーマットを認識するためにカスタムコードを作成する必要があります。

Ruby: List DateTime Format Optionsの回答では、パフォーマンスを向上させるために結果をキャッシュするDateParserクラスを実装して使用する方法を示しました。これは確かにこのような状況で役に立ちます。

1

我々はrescueと例外を処理:あなたもdatenilに設定されます。その場合には、空のbeginブロックを残すことができる上に

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

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

。また、ブロックの外側の割り当てを移動するにはもう少し慣用句です:

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

代わりにtry catchを使用できます。

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

これは有効なRubyコードではありません。 –