【问题标题】:how to obtain HTML-free contents for non-div tags如何获取非 div 标签的无 HTML 内容
【发布时间】:2011-11-26 16:09:24
【问题描述】:

我想为<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']

但是!它实际上是在输出:

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

【问题讨论】:

    标签: python screen-scraping beautifulsoup


    【解决方案1】:

    两种选择:

    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']
    

    【讨论】:

      【解决方案2】:

      至于问题的原因,以下是文档关于text关键字的说法:

      如果您使用文本,那么您为 name 和关键字参数提供的任何值都会被忽略。

      所以,findAll 基本上忽略了div.findAll(match_only_non_divs, text=True) 中的match_only_non_divs。您应该在进行匹配后获得文本(如 John Keyes 建议的那样)。

      【讨论】:

      • 感谢 Avaris 的解释 :)
      猜你喜欢
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      相关资源
      最近更新 更多