2011-09-28 120 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