Получить текст из определенных блоков, исключая некоторые вложенные теги - PullRequest
0 голосов
/ 20 февраля 2019

Я пытался создать скрипт Python, который на самом деле извлекает текст из определенного блока элемента, но должен исключить некоторый текст из вложенных братьев и сестер.

Это моя часть HTML, которую я пытаюсь очистить:

<div class="article_body">
    <div id="articleBodyContents">
        Stack Overflow
        <br/>
        Is Love
        <br/>
        <a href="https://example_site1.com" target="_blank">Ad</a>
        <br/>
        <a href="https://example_site2.com" target="_blank">Ad2</a>
    </div>
</div>

Вот до сих пор я прогрессировал:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")
divs = soup.findAll('div', {'id':'articleBodyContents'})
for ops in divs:
    print(ops.text.replace('\n', '').strip())

Однако это выводит на печать:

Stack Overflow
Is love
Ad
Ad2

Я хочу только:

Stack Overflow
Is love

1 Ответ

0 голосов
/ 20 февраля 2019

Вы почти у цели.Вам понадобится помощь NavigableString, чтобы достичь этого.Просто поймайте предыдущего родителя и повторите его, проверяя, являются ли строки экземпляром NavigableString.Вот ваш код:

from bs4 import BeautifulSoup, NavigableString

html = """
<div class="article_body">
    <div id="articleBodyContents">
        Stack Overflow
        <br/>
        Is love
        <br/>
        <a href="https://example_site1.com" target="_blank">Ad</a>
        <br/>
        <a href="https://example_site2.com" target="_blank">Ad2</a>
    </div>
</div>
"""

soup = BeautifulSoup(html, "html.parser")
divs = soup.find('div', {'class':'article_body'})
ops = [element for element in divs.div if isinstance(element, NavigableString)]
for op in ops:
    print(op.strip().replace('\n', ''))

Вывод:

Stack Overflow
Is love
...