2011-09-29 13 views
9

Sapete perché il primo esempio nel tutorial BeautifulSoup http://www.crummy.com/software/BeautifulSoup/documentation.html#QuickStartAttributeError: 'NavigableString' object has no attribute 'name'? Secondo lo this answer, i caratteri dello spazio nell'HTML causano il problema. Ho provato con fonti di poche pagine e 1 ha funzionato gli altri hanno dato lo stesso errore (ho rimosso gli spazi). Puoi spiegare a cosa si riferisce "nome" e perché si verifica questo errore? Grazie.BeautifulSoup: AttributeError: l'oggetto 'NavigableString' non ha attributo 'nome'

risposta

13

name farà riferimento al nome del tag, se l'oggetto è un Tag oggetto (es: <html> name = "html")

se si dispone di spazio nella vostra markup in tra i nodi BeautifulSoup si trasformerà quelli in NavigableString 'S. Pertanto, se si utilizza l'indice di contents per afferrare i nodi, è possibile prendere uno NavigableString anziché il successivo Tag.

Per evitare questo, query per il nodo che si desideri: Searching the Parse Tree

o se si conosce il nome del prossimo tag che si desidera, è possibile utilizzare tale nome come la proprietà e restituirà il primo Tag con questo nome o None se non esistono bambini con quel nome: Using Tag Names as Members

Se volete utilizzare il contents si controlla gli oggetti si sta lavorando. L'errore che si stanno ottenendo solo significa che si sta tentando di accedere alla proprietà nome perché il codice si presuppone che sia un Tag

5

È possibile utilizzare try catch per eliminare i casi in cui String navigabile viene analizzato nel ciclo, in questo modo:

for j in soup.find_all(...) 
     try: 
      print j.find(...) 
     except NavigableString: 
      pass 
3

semplicemente ignorare NavigableString oggetti mentre scorrendo l'albero:

response = requests.get(url) 
soup = BeautifulSoup(response.text, 'html.parser') 

for body_child in soup.body.children: 
    if isinstance(body_child, NavigableString): 
     continue 
    if isinstance(body_child, Tag): 
     print(body_child.name) 
+1

.find_all() appare per restituire solo tag di livello inferiore e ignora gli spazi bianchi ... –

Problemi correlati