2011-09-29 23 views
9

Czy wiesz, dlaczego pierwszy przykład w samouczku BeautifulSoup http://www.crummy.com/software/BeautifulSoup/documentation.html#QuickStart podaje AttributeError: 'NavigableString' object has no attribute 'name'? Według this answer znaki spacji w kodzie HTML powodują problem. Próbowałem ze źródłami kilku stron i 1 działałem, gdy inni podawali ten sam błąd (usunąłem spacje). Czy możesz wyjaśnić, do czego odnosi się "nazwa" i dlaczego pojawia się ten błąd? Dzięki.BeautifulSoup: AttributeError: Obiekt "NavigableString" nie ma atrybutu "nazwa"

Odpowiedz

13

name będzie odnosić się do nazwy tagu, jeśli obiekt jest Tag obiekt (tj: <html> name = „html”)

jeśli masz spacji znaczników w między węzłami BeautifulSoup zamieni ci w NavigableString . Więc jeśli użyjesz indeksu contents do przechwytywania węzłów, możesz pobrać NavigableString zamiast następnego Tag.

Aby tego uniknąć, zapytanie dla węzła szukasz: Searching the Parse Tree

lub jeśli znasz nazwę następnego tagu chcesz, możesz użyć tej nazwy jako własność i powróci pierwsza Tag z tą nazwą lub jeśli nie None dzieci z tą nazwą istnieje: Using Tag Names as Members

Jeśli chcesz użyć contents trzeba sprawdzić obiekty, które pracują z. Błąd otrzymujesz po prostu oznacza, że ​​próbujesz uzyskać dostęp do właściwości name, ponieważ kod zakłada, że ​​to Tag

5

Można użyć try catch, aby wyeliminować przypadki Żeglowny String jest analizowany w pętli, podobnie jak to:

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

zignoruj ​​NavigableString obiektów podczas iteracja drzewa:

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() pojawia się tylko powrócić tagów dziecko i ignoruje spacje ... –

Powiązane problemy