Подтвердить что ты не робот

BS4: Получение текста в теге

Я использую красивый суп. Есть такой тег:

<li><a href="example"> s.r.o., <small>small</small></a></li>

Я хочу получить текст только внутри тега привязки <a>, без тега <small> в выводе; то есть "s.r.o.,"

Я попытался find('li').text[0], но он не работает.

Есть ли в BS4 команда, которая может это сделать?

4b9b3361

Ответ 1

Один из вариантов состоит в том, чтобы получить первый элемент из contents элемента a:

>>> from bs4 import BeautifulSoup
>>> data = '<li><a href="example"> s.r.o., <small>small</small></a></li>'
>>> soup = BeautifulSoup(data)
>>> print soup.find('a').contents[0]
 s.r.o., 

Другим было бы найти тег small и получить предыдущий родной брат:

>>> print soup.find('small').previous_sibling
 s.r.o., 

Ну, есть и всевозможные альтернативные/сумасшедшие варианты:

>>> print next(soup.find('a').descendants)
 s.r.o., 
>>> print next(iter(soup.find('a')))
 s.r.o., 

Ответ 2

Используйте . children

soup.find('a').children.next()
s.r.o.,

Ответ 3

Если вы хотите выполнить цикл для печати всего содержимого тегов привязки, расположенных в строке html/веб-странице (необходимо использовать urlopen из urllib), это работает:

from bs4 import BeautifulSoup
data = '<li><a href="example">s.r.o., <small>small</small</a></li> <li><a href="example">2nd</a></li> <li><a href="example">3rd</a></li>'
soup = BeautifulSoup(data,'html.parser')
a_tag=soup('a')
for tag in a_tag:
    print(tag.contents[0])     #.contents method to locate text within <a> tags

Выход:

s.r.o.,  
2nd
3rd

a_tag - список, содержащий все теги привязки; сбор всех тегов привязки в списке, позволяет редактировать группы (если имеется более одного тега <a>.

>>>print(a_tag)
[<a href="example">s.r.o.,  <small>small</small></a>, <a href="example">2nd</a>, <a href="example">3rd</a>]