2016-05-28 3 views
1

Ich kratze eine Website und ich versuche, das Datum für zum Beispiel ein Buch-Release-Datum zu bekommen. Die Seite liefert nicht immer ein Datum für jedes Buch und ich sah manchmal "Kein Datum", "????", "Noch nicht freigegeben" und so weiter. Wie kann ich das umgehen, wenn ich versuche etwas zu tun, was ich unten habe und keinen Fehler bekomme? Ich kann eine if Aussage laufen lassen, aber ich fühle, dass es unordentlich wird.Wie kann ich eine Zeichenfolge übergeben, die kein Datum ist, wenn ich versuche, Date.parse ein Datum?

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

Antwort

1

Die chronic gem bietet robuste Datum Parsing und werden ungültige Formate wie diejenigen behandeln Sie, wie gut erleben.

Sie können es mit installieren:

gem install chronic 

oder in Ihrem Gemfile:

gem "chronic" 

Sie können die Daten aus Ihrem Beispiel analysieren, wie so:

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

Wenn das Datum ist ungültig, Chronic wird nil zurückgeben. Dann müssen Sie nur sicherstellen, dass Ihr Code nil-aware ist; jede Lösung, die mit ungültigen Daten befasst sein muss nil-aware, so ist diese Anforderung nicht exklusiv für Chronic.

Das Chronische Juwel wurde seit einer Weile nicht aktualisiert, aber es ist immer noch relevant. Es deckt so viel Boden mit Datums-Parsing ab, dass Sie in der Lage sein werden, es für das Zitat einige Zeit zu verwenden. Zum Beispiel können Sie Daten in einer Vielzahl von Formaten finden (z. B. '12/13/99 ',' 2002-10-04 ',' 13. Mai 2007 '), und Chronic behandelt diejenigen, die nicht ins Schwitzen geraten. Der Ruby-Date-Parser unterstützt standardmäßig nur eine begrenzte Anzahl von Formaten. Sie müssen dafür benutzerdefinierten Code erstellen, um mehr Datumsformate zu erkennen.

In der akzeptierten Antwort für Ruby: List DateTime Format Options, ich habe gezeigt, wie eine DateParser Klasse zu implementieren und zu verwenden, die auch Ergebnisse zur Verbesserung der Leistung zwischenspeichert; das ist eine Lektüre wert, da es unter solchen Umständen sicherlich hilft.

1

In Ruby behandeln wir Ausnahmen mit 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)> 

In dem oben Sie könnte auch den begin Block leer lassen, wobei in diesem Fall date würde nil eingestellt werden. Außerdem ist es etwas mehr idiomatische die Zuordnung außerhalb des Blocks zu bewegen:

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

Sie auch rescue als Postfix oder Modifikator Ausdruck verwenden können:

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

verwenden sparsam, aber da man‘ t Geben Sie den Ausnahmetyp an, sodass er möglicherweise Ausnahmen verschluckt, die Sie nicht erwarten, was das Debugging erschweren kann.

1

Sie können stattdessen try catch verwenden.

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

Dies ist kein gültiger Ruby-Code. –

Verwandte Themen