Ich versuche, einige Informationen von Webseiten, die inkonsistent über wo sind die Informationen befindet kratzen. Ich habe Code, um mit jeder von mehreren Möglichkeiten umzugehen; was ich will, ist, sie nacheinander zu versuchen, und wenn keiner von ihnen funktioniert, würde ich gern scheitern und weitermachen.Python versuchen/außer: versuchen, mehrere Optionen
Das heißt, in psuedo-Code:
try:
info = look_in_first_place()
otherwise try:
info = look in_second_place()
otherwise try:
info = look_in_third_place()
except AttributeError:
info = "Info not found"
ich dies mit verschachtelten try-Anweisungen tun könnte, aber wenn ich 15 Möglichkeiten müssen versuchen, dann werde ich 15 Ebene der Vertiefung brauchen!
Das scheint eine trivial genug Frage zu sein, dass ich fühle, dass ich etwas vermisse, aber ich habe es in den Boden gesucht und kann nichts finden, das dieser Situation ähnlich aussieht. Gibt es einen vernünftigen und pythonischen Weg, dies zu tun?
EDIT: Wie Johns (ziemlich gute) Lösung unten anhebt, habe ich für die Kürze jedes Nachschlagen oben als einen einzelnen Funktionsaufruf geschrieben, während es in Wirklichkeit normalerweise ein kleiner Block von BeautifulSoup-Anrufen wie soup.find('h1', class_='parselikeHeader')
ist. Natürlich könnte ich diese in Funktionen einpacken, aber es scheint ein bisschen unelegant mit solchen einfachen Blöcken - Entschuldigung, wenn meine Kurzschrift das Problem jedoch ändert.
Dies kann eine nützlichere Darstellung sein:
try:
info = soup.find('h1', class_='parselikeHeader').get('href')
if that fails try:
marker = soup.find('span', class_='header')
info = '_'.join(marker.stripped_strings)
if that fails try:
(other options)
except AttributeError:
info = "Info not found"
warum brauchen Sie einen Try/außer, verwenden, wenn elif sonst –
Dank Padraic, aber zusätzlich zu einem Instinkt EAFP über LYBL zu bevorzugen, ich bin nicht sicher, ob ich in der Lage sein würde, die, wenn die Bedingungen vorherzusagen zu überprüfen, wie es auf viele verschiedene Arten schief gehen konnte, so schien es eine natürliche Angemessenheit, mit einer begrenzten Anzahl von Ausnahmen umzugehen. – user3816044
find wird leer sein, wenn es nichts ergibt, also wenn find ... nur True ist, wenn es eine Übereinstimmung gibt, wenn elif else sonst arbeiten würde. Sie könnten alle Muster in eine Liste einfügen und mit if check und ein anderes, wenn keines passt –