簡體   English   中英

使用Python和BeautifulSoup編輯字符串並收集數據

[英]Editing Strings and Scraping Data Using Python and BeautifulSoup

我正在嘗試使用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()提取所需的信息,但這給了我很多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')隔離字符串“ Total:”,但是它似乎無法獲得實際數字,因為該數字未包含在粗體中:

<td colspan="2">
  <strong>Total:</strong> 8
</td>

我試圖出去一個,並使用soup.find_all(lambda tag: tag.name == 'td' and tag.get('colspan') == ["2"])拾起桌子的那一行,但是它沒有我這樣做時什么也不會退貨。 我如何挑選競爭對手的總數?

(由於部門的總數和總數是按順序列出的,所以我不必擔心將總數與部門進行匹配,只要我對順序保持謹慎即可。)

您可以使用循環來獲取所需的值。

#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)

您現在應該有一個列表列表->部門以及一個列表->競爭對手。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM