как получить содержимое без HTML для тегов без div - PullRequest
0 голосов
/ 28 сентября 2011

Я хочу найти содержимое HTML-тегов без тегов , за исключением для тегов внутри <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']

НО!на самом деле он выводит:

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

3 голосов
/ 28 сентября 2011

Две альтернативы для вас:

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 голос
/ 28 сентября 2011

Что касается причины проблемы, вот что говорит доктор относительно ключевого слова text:

Если вы используете текст, то любые значения, которые вы указываете для имени и аргументов ключевого слова, игнорируются.

Итак, findAll в основном игнорирует match_only_non_divs в div.findAll(match_only_non_divs, text=True). Вы должны получить текст после сопоставления (как предложил Джон Киз).

...