Il mio problema è generale, come concatenare una serie di ricerche di attributi quando uno di quelli intermedi potrebbero restituire None
, ma da quando mi sono imbattuto in questo problema cercando di utilizzare Beautiful Soup, ho intenzione di chiedere che in quel contesto .Come concatenare le ricerche di attributi che potrebbero restituire None in Python?
Beautiful Soup analizza un documento HTML e restituisce un oggetto che può essere utilizzato per accedere al contenuto di tale documento strutturato. Ad esempio, se il documento analizzato è nella variabile soup
, posso ottenere il titolo con:
title = soup.head.title.string
mio problema è che se il documento non ha un titolo, quindi soup.head.title
rendimenti None
e la successiva ricerca string
lancia un'eccezione Potrei rompere la catena come:
x = soup.head
x = x.title if x else None
title = x.string if x else None
ma questo, ai miei occhi, è prolisso e difficile da leggere.
Potrei scrivere:
title = soup.head and soup.head.title and soup.title.head.string
ma che è prolisso e inefficiente.
Una soluzione se pensata, che penso sia possibile, sarebbe quella di creare un oggetto (chiamarlo nil
) che restituirebbe None
per qualsiasi ricerca di attributi. Questo mi permetterebbe di scrivere:
title = ((soup.head or nil).title or nil).string
ma questo è piuttosto brutto. C'è un modo migliore?
Forse mantenere il vostro codice e pescato + gestire il 'AttributeError' eccezione nei casi in cui viene restituito' none'. – crayzeewulf
Cosa vuoi che ritorni? – mgilson
[ 'Maybe'monad in python] (http://stackoverflow.com/questions/8507200/maybe-kind-of-monad-in-python). Vedere anche [Monadi in Python (con la sintassi bello!)] (Http://www.valuedlessons.com/2008/01/monads-in-python-with-nice-syntax.html) – jfs