繁体   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