Убрать ненужные теги из bs4.element.Tag
Доброй ночи друзья, пишу небольшой парсер:
import requests
from bs4 import BeautifulSoup
import re
LINK = "https://premierliga.ru/tournaments/championship/tournament-table/"
def main():
link = LINK
print(get_data(get_html(link)))
def get_html(link):
response = requests.get(link)
return response.text
def get_data(html):
soup = BeautifulSoup(html,'lxml')
trs = soup.find('div', class_=('stats-tournament-
table')).find('table').find_all('tr')
for tr in trs:
position = tr.find('td', class_='place')
print (position)
#return trs
if __name__=='__main__':
main()
Столкнулся со следующей проблемой, парсер возвращает мне:
<td class="place">
<span></span>1
</td>
<td class="place">
<span></span>2
</td>
А я хочу получить только текст, в данном случае цифры между тегами, но у меня никак не получается. Пробовал воспользоваться get_text(), но пишет что нет такого атрибута, пробовал replace, результат тот же (видимо из за того, что это не строка), как можно отсюда вычленить только текст? Заранее спасибо
Ответы (3 шт):
Не знаю насколько правильно так делать, bs4.element.tag > в строку, и так очищать. В целом проблема решена.
def get_data(html):
soup = BeautifulSoup(html,'lxml')
trs = soup.find('div', class_=('stats-tournament-table')).find('table').find_all('tr')
for tr in trs:
position = tr.find('td', class_='place')
position_str = re.sub('<[^>]+>',"",str(position))
position_str = ''.join(position_str.split())#убираем перенос
print(position_str)
#return trs
Самый нижний цикл в листинге:
trs = bla_bla
for tr in trs:
position = tr.find('td', {'class': 'place'})
print (position.text.strip())
<tag>.text извлекает из тега текст целиком даже, если в нём есть вложенные теги со своим содержимым. Если все теги class="place" однотипные, с пустыми спанами, то вполне пойдёт и такой вариант. Функция strip() убирает пробельные символы по краям извлечённого текста.
Правильней еще раз пройти в цикле:
def get_data(html):
soup = BeautifulSoup(html,'lxml')
trs = soup.find('div', class_=('stats-tournament-table')).find('table').find_all('tr')
for tr in trs:
position = tr.find_all('td', class_='place')
for i in position:
print (i.text.replace('\n', ''))