#python #python-3.x #web-scraping #beautifulsoup
Вопрос:
Я соскабливаю веб-страницу с несколькими p
элементами, и я хочу, чтобы текст был внутри них, не включая их детей.
Структура страницы выглядит следующим образом:
<p class="default">
<div>I don't want this text</div>
I want this text
</p>
Когда я использую
parent.find_all("p", {"class": "default").get_text()
вот какой результат я получаю:
I don't want this text
I want this text
Я использую BeautifulSoup 4 с Python 3
Редактировать: Когда я использую
parent.find_all("p", {"class": "public item-cost"}, text=True, recursive=False)
Он возвращает пустой список
Комментарии:
1. У вас есть два открытых
<div>
тега. Это то, что у тебя действительно есть?2. Извините, опечатка. Исправлено.
Ответ №1:
Вы можете использовать .find_next_sibling()
с text=True
параметром:
from bs4 import BeautifulSoup
html_doc = """
<p class="default">
<div>I don't want this text</div>
I want this text
</p>
"""
soup = BeautifulSoup(html_doc, "html.parser")
print(soup.select_one(".default > div").find_next_sibling(text=True))
С принтами:
I want this text
Или с помощью .contents
:
print(soup.find("p", class_="default").contents[-1])
ИЗМЕНИТЬ: Чтобы удалить строку:
print(soup.find("p", class_="default").contents[-1].strip())
Комментарии:
1. содержимое[-1] должно быть удалено
Ответ №2:
Вы можете использовать xpath, который немного сложен, но обеспечивает очень мощный запрос.
Что-то подобное сработает для вас:
soup.xpath('//p[contains(@class, "default")]//text()[normalize-space()]')