Próbuję zeskrobać niektóre informacje ze stron internetowych, które nie są zgodne co do lokalizacji informacji. Mam kod do obsługi każdej z kilku możliwości; chcę je wypróbować w kolejności, a jeśli żadna z nich nie zadziała, chciałbym z wdziękiem i przejść dalej.Python try/except: próba wielu opcji
Oznacza to, że w psuedo-kod:
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"
mogłem zrobić to z zagnieżdżonych instrukcji try, ale jeśli muszę 15 mozliwosci spróbować potem będę potrzebował 15 poziomów wcięcia!
To wydaje się dość banalne pytanie, że czuję, że czegoś brakuje, ale przeszukałem go w terenie i nie mogę znaleźć niczego, co wyglądałoby równoznacznie z tą sytuacją. Czy istnieje rozsądny i Pythoniczny sposób na zrobienie tego?
EDYCJA: Jak podchodzi rozwiązanie Johna (całkiem niezłe) poniżej, dla zwięzłości napisałem każde z powyższych wyrażeń powyżej jako pojedyncze wywołanie funkcji, podczas gdy w rzeczywistości jest to zwykle mały blok wywołań BeautifulSoup, takich jak soup.find('h1', class_='parselikeHeader')
. Oczywiście mogłem owijać je funkcjami, ale wydaje się to trochę nieeleganckie w przypadku takich prostych bloków - przepraszam, jeśli mój skrót modyfikuje problem.
To może być bardziej przydatny ilustracji:
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"
dlaczego trzeba spróbować/chyba, użyj jeśli elif else –
Dzięki PADRAIC, ale oprócz instynktu faworyzować EAFP nad LYBL, nie jestem pewien, że będę w stanie przewidzieć, czy warunki aby sprawdzić, jak mogło się nie udać na wiele różnych sposobów, więc obsługa ograniczonej, ale szerokiej gamy wyjątków wydawała się naturalnym dopasowaniem. – user3816044
find będzie puste, jeśli nie pasuje do niczego, więc jeśli find ... będzie prawdą tylko wtedy, gdy istnieje dopasowanie, więc jeśli elif będzie działał. Możesz umieścić wszystkie wzorce na liście i przeglądać je za pomocą sprawdzenia if i in else if none match –