如何获取非div标签的无HTML内容

时间:2011-09-28 08:21:55

标签: python screen-scraping beautifulsoup

我想查找<div id="nav">

内标记的所有标记外的无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']

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”)内部行走,但它会进入内部。 请帮忙!!

2 个答案:

答案 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建议的那样)。