February 5, 2021

Скачивание информации из списка тегов на Python

Для  скачивания интересуемой информации путем парсинга страниц приходится  обращаться к отдельным тегам и получать их содержимое в виде атрибутов  или текстового поля. С этим мы неоднократно сталкивались при разборе  тестовых страниц об описании проведенных спортивных мероприятий  (подробнее здесь и здесь).

Вместе  с тем зачастую хранение сведений организовано в виде списков или  таблиц, что облегчает задачу разбора. Например, пусть перед нами стоит  задача извлечения данных о турнире по смешанным единоборствам UFC: дате,  месте проведения  и количестве зрителей. На скриншоте ниже можно  заметить, что эта информация организована в виде списка (тег 'ul' и  внутри элементы - 'li').

При  этом в каждом элементе списка хранится тег 'i' с атрибутом  'class'='b-list__box-item-title', содержимым которого является название  искомой информации, в то время как значение попадает в текстовую область  его родителя - тега 'li':

Такого  рода информацию можно извлечь следующим образом. Получить список  интересуемых тегов 'i' с атрибутом 'class'='b-list__box-item-title' (с  помощью объекта BeautifulSoup и метода findAll, подробнее здесь), для каждого извлечь его содержимое с помощью метода get_text, затем обратиться к тегу родителя, получить его содержимое и убрать содержимое дочернего тега (это нужно, так как метод get_text  извлекает все содержимое как самого тега, так и  дочерних).  При этом в  ходе работы с тегами получаемые строки необходимо очищать  от  пробельных символов с помощью метода strip.

Все это можно осуществить с помощью следующего кода:

from bs4 import BeautifulSoup
from general_modules import net_scrape

delay = 1    
url = 'http://www.ufcstats.com/event-details/33b2f68ef95252e0?'
html = net_scrape.get_url_delay(delay=delay, url = url).text
bsObj = BeautifulSoup(html, 'lxml')

event_inf = []
event_inf_tags = bsObj.findAll('i',{'class':'b-list__box-item-title'})
for i,tag in enumerate(event_inf_tags):
       event_inf.append(tag.parent.get_text().replace(tag.get_text().strip(),'').strip())

Для загрузки страницы используется ранее описанная функция get_url_delay: