Редактирование строк и очистка данных с использованием Python и BeautifulSoup - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь собрать количество регистрантов для каждого дивизиона на предстоящем чемпионате мира по бразильскому джиу-джитсу, используя 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"]), но он ничего не возвращает, когда я это делаю.Как мне определить общее количество конкурентов?

(Поскольку количество делений и итогов указаны вместе и по порядку, я не думаю, что мне нужно беспокоиться о том, чтобы сопоставить итоги с делением до тех пор, покакак я осторожен в заказе.)

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете использовать цикл для получения необходимых значений.

#Segregate data by rows
    rows = soup.findAll('div',{'class':'row'})

    #Create empty lists
    divisions = []
    competitors = []

    #Create and append respective lists with a loop
    for row in rows:
        raw_division = row.h4.text
        division = raw_division.split('/')
        divisions.append(division)

        raw_competitors = row.tfoot.tr.td.text.strip()
        competitor = raw_competitors.replace('Total: ','')
        competitors.append(competitor)

Теперь у вас должен быть список списков -> подразделений, а также список -> конкурентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...