![](/img/trans.png)
[英]UnicodeEncodeError: Scraping data using Python and beautifulsoup4
[英]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.