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

#python-3.x #beautifulsoup

#python-3.x #beautifulsoup

Вопрос:

Я где-то нашел веб-сайт, использующий следующую структуру HTML:

 ...
<td>
  <span>some span text</span>
  some td text
</td>
...
 

Я заинтересован в получении "some td text" , а не в "some span text" , но get_text() метод, похоже, возвращает весь текст как "some span textsome td text" . Есть ли способ получить только текст внутри определенного элемента с помощью BeautifulSoup?

Не все td s имеют одинаковую структуру, поэтому, к сожалению, я не могу предсказать структуру результирующей строки, чтобы обрезать ее там, где это необходимо.

Ответ №1:

У каждого элемента есть name атрибут, который сообщает вам тип тега, например div , , td , span . В случае отсутствия тега (голого содержимого) он будет None .

Таким образом, вы можете просто использовать простое понимание списка, чтобы отфильтровать все элементы тега.

 from bs4 import BeautifulSoup

html = '''
<td>
  <span>some span text</span>
  some td text
</td>
'''

soup = BeautifulSoup(html, 'html.parser')
content = soup.find('td')
text = [c.strip() for c in content if c.name is None and c.strip() != '']
print(text)
 

Это приведет к печати:

[‘некоторый текст td’]

после некоторой очистки от новых строк и пустых строк.

Если вы хотите впоследствии объединить контент, вы можете использовать join :

 print('n'.join(text))
 

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

1. Потрясающе, не знал о name трюке с атрибутом, спасибо!