Получить текст из внутреннего элемента без его дочерних элементов

#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()]')