我想查找<div id="nav">
例如,使用以下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']
BUT!它实际上正在输出:
[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”)内部行走,但它会进入内部。 请帮忙!!
答案 0 :(得分: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']
答案 1 :(得分:1)
至于问题的原因,以下是关于text
关键字的文档:
如果您使用文本,则忽略您为name和关键字参数提供的任何值。
因此,findAll
基本上忽略了match_only_non_divs
中的div.findAll(match_only_non_divs, text=True)
。在进行匹配后你应该得到文本(正如John Keyes建议的那样)。