Скачивание информации из списка тегов на 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: