#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
трюке с атрибутом, спасибо!