Рекурсивно перебирать вложенные теги внутри div - BeautifulSoup - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу перемещаться по тегу div с помощью Beautiful Soup для извлечения некоторых данных. HTML Структура выглядит примерно так:

<div id="important-data">
 <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p>
 <p> <b> Heading Goes here </b> </p>
 <p> Paragraph goes here </p>
 <ul>
    <li> Item 1 </li>
    <li> Item 2 </li>
    <li> Item 3 </li>
 </ul>
 <p> Lorem 2 ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p>
</div>

Оригинал HTML do c может содержать более 30 вложенных тегов (включая другие теги, такие как span или даже вложенные теги div) внутри div и мне нужно перемещаться по ним все

До сих пор я извлек HTML и сохранил в переменной

important_data_to_be_extracted = soup.find("div", id="important-data").prettify()
## Soup here is the HTML given above

Результат, который я ожидаю:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Heading Goes here
Paragraph goes here
Item 1
Item 2
Item 3
Lorem 2 ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Самое главное, чтобы EOL присутствовал. Я попробовал несколько методов, используя генератор .children или методы find_all (), но они кажутся слишком наивными и неуклюжими.

Существует ли эффективный способ извлечения данных из структуры?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Вы можете использовать .contents, который возвращает список всего содержимого тега и аналогично .children

from bs4 import BeautifulSoup as bs , Tag

html = '''
<div id="important-data">
 <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p>
 <p> <b> Heading Goes here </b> </p>
 <p> Paragraph goes here </p>
 <ul>
    <li> Item 1 </li>
    <li> Item 2 </li>
    <li> Item 3 </li>
 </ul>
 <p> Lorem 2 ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p>
</div>'''


soup = bs(html, 'html.parser')
div = soup.find("div", id="important-data")
for t in div.children:
        if type(t)== Tag :
                tag_text = t.text.strip()
                print(tag_text)

Вывод:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua.
Heading Goes here
Paragraph goes here
Item 1
 Item 2
 Item 3
Lorem 2 ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
0 голосов
/ 09 апреля 2020
from bs4 import BeautifulSoup
html = """
<div id="important-data">
 <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p>
 <p> <b> Heading Goes here </b> </p>
 <p> Paragraph goes here </p>
 <ul>
    <li> Item 1 </li>
    <li> Item 2 </li>
    <li> Item 3 </li>
 </ul>
 <p> Lorem 2 ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p>
</div>
"""


soup = BeautifulSoup(html, 'html.parser')

target = soup.find("div", id="important-data")

print(target.text.strip())

Выход:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
  Heading Goes here
 Paragraph goes here

 Item 1
 Item 2
 Item 3

 Lorem 2 ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...