Я пытаюсь собрать количество регистрантов для каждого дивизиона на предстоящем чемпионате мира по бразильскому джиу-джитсу, используя Python и Beautiful Soup.(Цель в конце состоит в том, чтобы составить график количества конкурентов в каждом подразделении, поэтому имя каждого регистранта не имеет значения.)
Я могу получить некоторую информацию, которую хочу, используя BeautifulSoup, но яне могу точно выделить то, что я хочу.
import urllib2
from bs4 import BeautifulSoup
import fileinput
import matplotlib
page = urllib2.urlopen("https://www.ibjjfdb.com/ChampionshipResults/926/PublicRegistrations?lang=en-US").read()
soup = BeautifulSoup(page,'html.parser')
Мой первоначальный план состоял в том, чтобы просмотреть все данные, подсчитать имена людей, зарегистрированных в каждом подразделении, сохранить их как набор данных, а затемнанесите информацию по весу, возрасту и т. д. Теперь я вижу, что в нижней части каждого деления есть счетчик, поэтому все, что мне действительно нужно, это определить весовое деление и общее количество.
Первоначально я пытался использоватьsoup.find_all()
чтобы получить информацию, которую я хотел, но это дает мне много лишнего.Я начал с попытки вытянуть всю таблицу с помощью команды, которую я извлек из другого вопроса StackOverflow:
result = soup.find_all(lambda tag: tag.name == 'div' and tag.get('class') == ["row"])
, которая дает одну длинную строку, содержащую то, что я хочу:
[<div class="row">\n<h4>BLUE / Juvenile 1 / Male / Rooster</h4>\n<table class="table table-striped">\n<tr>\n<td style="width:40%;">\r\n Atos Jiu-Jitsu\r\n [...]
Чтобы сузить еевниз, я искал заголовок, который просто дает весовые категории:
all_divisions = [division for division in soup.find_all("h4")]
, который хорошо работает и дает:
[<h4>BLUE / Juvenile 1 / Male / Rooster</h4>, <h4>BLUE / Juvenile 1 / Male / Light-Feather</h4>, <h4>BLUE / Juvenile 1 / Male / Feather</h4>, <h4>BLUE / Juvenile 1 / Male / Light</h4>, [...]
Я хочу иметь возможность разделить их на их отдельные группы такЯ могу построить это.Как я могу разделить это?Я попытался использовать all_divisions[0].split()
, но, по-видимому, soup.find_all()
возвращает строки NoneType вместо строк.
Далее я пытаюсь получить общее значение.Я могу выделить строку «Всего:», используя soup.find_all('strong')
, но не могу получить фактическое число, поскольку оно не включено в жирный шрифт:
<td colspan="2">
<strong>Total:</strong> 8
</td>
Я попытался выйти один и выбратьвверх по этой строке таблицы, используя soup.find_all(lambda tag: tag.name == 'td' and tag.get('colspan') == ["2"])
, но он ничего не возвращает, когда я это делаю.Как мне определить общее количество конкурентов?
(Поскольку количество делений и итогов указаны вместе и по порядку, я не думаю, что мне нужно беспокоиться о том, чтобы сопоставить итоги с делением до тех пор, покакак я осторожен в заказе.)