2011-09-29 28 views
9

你知道爲什麼在BeautifulSoup教程http://www.crummy.com/software/BeautifulSoup/documentation.html#QuickStart第一個例子給AttributeError: 'NavigableString' object has no attribute 'name'?根據this answer在HTML中的空格字符導致問題。我嘗試了幾頁的來源,其中1人工作,其他人給了同樣的錯誤(我刪除了空格)。你能解釋一下「名稱」是指什麼以及爲什麼會發生這種錯誤?謝謝。BeautifulSoup:AttributeError的:「NavigableString」對象有沒有屬性「名」

回答

13

name將參考標記的名稱如果對象是一個Tag對象(即:<html>名=「HTML」),如果你有在節點之間在您的標記空間BeautifulSoup將會把這些變成NavigableString

的。所以,如果你使用contents的索引節點搶,你可能會搶NavigableString,而不是下一個Tag

爲了避免這種情況,請查詢節點您正在尋找:Searching the Parse Tree

,或者如果你知道你想下一個標籤的名稱,你可以使用該名稱作爲屬性,它會返回第一個Tag與名稱或None如果沒有孩子這個名字存在:Using Tag Names as Members

如果你想使用contents你必須檢查你正在使用的對象。你所得到的錯誤只是意味着你正在嘗試,因爲代碼假定它是一個Tag

5

您可以使用try catch來消除情況下,當通航字符串在循環被解析,這樣訪問name屬性:

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

不理會NavigableString對象,同時通過樹遍歷:

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()似乎只返回子標籤,而忽略空格... –

相關問題