2011-09-28 88 views
0

我想找到除了內<div id="nav">如何獲得免費的HTML內容的非div標籤

舉例而言,所有標籤的免費的HTML內容的標籤,具有以下HTML:

<div id="nav"> 
    <h1>Navigate!</h1> 
    <nav role="navigation"> 
     <h2 class="structural">Main navigation</h2> 
     <ul> 
      <li><a href="/">Home</a></li> 
      <li><a href="/about/">About</a></li> 
     </ul> 
     </nav> 

     <div id="inside_nav"> 
      <ul>  
       <li><a href="/">inside_home</a></li> 
       <li><a href="/about/">inside_About</a></li> 
      </ul> 
     </div> 
</div> 

代碼:

div = soup1.find("div", id="nav") 

def match_only_non_divs(tag): 
    return (tag.findParent("div").get('id') == div.get('id')) and tag.name != "div" 

print div.findAll(match_only_non_divs, text=True) 

此代碼應輸出:

[u'\n', u'Navigate!', u'Main navigation', 
u'Home', u'About', u'\n'] 

但是!它實際上是輸出:

[u'\n', u'Navigate!', u'Main navigation', 
u'Home', u'About', u'\n', 
u'inside_home', u'inside_About', u'\n'] 

的代碼不應該走內部的div內(ID =「inside_nav」),但它是內部的準備。 請幫忙!!你

回答

3

兩種選擇:

print [t.string for t in div.findAll(match_only_non_divs)] 
# [u'Navigate!', None, u'Main navigation', None, None, u'Home', None, u'About'] 

print [t.string for t in div.findAll(match_only_non_divs) if t.string] 
# [u'Navigate!', u'Main navigation', u'Home', u'About'] 
+0

謝謝約翰! – Jamal

+0

不客氣。 –

1

至於問題的原因,這裏是什麼醫生說關於text關鍵字:

如果你使用的文字,那麼任何值,你給的名稱和關鍵字參數被忽略。

所以,findAll基本上忽略了div.findAll(match_only_non_divs, text=True)match_only_non_divs。你應該在做完匹配後得到文本(正如John Keyes所建議的那樣)。

+0

當然我應該在上面解釋。謝謝Avaris。 –

+0

感謝Avaris的解釋:) – Jamal

相關問題