Как получить текст, заключенный в тег, который содержит несколько вложенных тегов, с помощью beautifulsoup?

#python #python-3.x #web-scraping #beautifulsoup #web-crawler

#питон #python-3.x #очистка веб-страниц #beautifulsoup #веб-сканер

Вопрос:

Я пытаюсь очистить веб-страницу со следующим тегом:

   <div style="text-align: center;">
            <img src="https://documents.google.com/" alt="" width="60" height="30" />
            <br />
            Pick me please.

        <p> Do not pick me please! </p>

        <br />
        <br />
    </div>
 

Я хочу очистить строку «выбери меня, пожалуйста», но не хочу очищать строку «Не выбирай меня, пожалуйста!». Есть идеи, как это сделать?

РЕДАКТИРОВАТЬ: я был бы признателен за более общее решение, когда я всегда хочу получить текст под определенным тегом, которого нет ни в одном вложенном теге

Ответ №1:

Редактировать

Более «общее» решение для find() непустого text node в div :

 parent = soup.select_one('div')
parent.find(text=lambda text: text and text.strip(), recursive=False).strip()
 

Чтобы использовать текстовый узел previous_sibling и избегать пробелов, … strip() результат.

 soup.select_one('div p').previous_sibling.strip()
 

или используйте get_text() и strip :

 soup.select_one('div').get_text('|', strip=True).split('|')[0]
 

Минимальный пример

 from bs4 import BeautifulSoup

html = '''
<div style="text-align: center;">
            <img src="https://documents.google.com/" alt="" width="60" height="30" />
            <br />
            Pick me please.

        <p> Do not pick me please! </p>

        <br />
        <br />
    </div>
'''
soup = BeautifulSoup(html, 'lxml')

soup.select_one('div p').previous_sibling.strip()
 

Вывод

Выберите меня, пожалуйста.

Комментарии:

1. Спасибо за ваш ответ, я ценю ваше решение. Может ли быть более «общее» решение этой проблемы? Если я всегда хочу получать текст под определенным тегом, которого нет внутри каких-либо вложенных тегов?

2. @IntoAbhi : посмотрите, добавлено более «общее» решение, которое должно соответствовать вашим требованиям — не так ли?

3. Да, это именно то, что решает проблему. Спасибо за ваш ответ!

Ответ №2:

Вы также можете использовать get_text() метод. Он возвращает весь текст в документе или под тегом в виде одной строки Unicode. Здесь я использовал регулярное выражение re.compile для получения текста.

 import re
from bs4 import BeautifulSoup
html= """<div style="text-align: center;">
            <img src="https://documents.google.com/" alt="" width="60" height="30" />
            <br />
            Pick me please.

        <p> Do not pick me please! </p>

        <br />
        <br />
    </div>"""

soup = BeautifulSoup(html, 'lxml')
print(soup.find(text=re.compile("Pick me please.")).strip())
 

Ответ №3:

Вы можете выполнить поиск по <br> тегу, а затем вызвать find_next() метод, который вернет первое совпадение.

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

print(soup.select_one('div br').find_next(text=True).strip())
 

Вывод:

 Pick me please.