#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.