为了账号安全,请及时绑定邮箱和手机立即绑定

Divs 下的强实例 - 仅捕获初始实例

Divs 下的强实例 - 仅捕获初始实例

慕森卡 2022-06-02 14:35:11
我的代码有一个小问题。实际上,我的目标是从一些代码中获取以下实例:<td><div><div>8 of 15 — <strong>53%</strong></div><div><div style="width: 100%"><div style="width: 53%"></div></div></div></div></td>我试图在 div 中捕获数据,在强之前,以及强百分比。目前正在使用以下内容获取这些数据,但我只能获取 a) 第一个实例或 b) 空值:from bs4 import BeautifulSoup as bsoupimport requests as reqsother_stat_list = []page_to_parse = 'https://fbref.com/en/matches/033092ef/Northampton-Town-Lincoln-City-August-4-2018-League-Two'page = reqs.get(page_to_parse)status_code = page.status_codestatus_code = str(status_code)parse_page = bsoup(page.content, 'html.parser')find_other_stats = parse_page.find_all('div', id="team_stats")for stat in find_other_stats:    add_other_stats = stat.find_next('strong').get_text()    other_stat_list.append(add_other_stats)    print(add_other_stats)我之前遇到过类似的问题,不是所有的 div 实例都被捕获。我运行了一个递归来捕获代码中的所有孩子:find_other_stats = parse_page.find_all('div', id="team_stats")all_other_stats = find_other_stats[0].find_all('div', recursive=False)for stat in all_other_stats:    add_other_stats = find_next('strong').get_text()     other_stat_list.append(add_team)然而,这个变体也会产生空值,所以不确定为什么递归不起作用。期望得到'53%',理想情况下是'8 of 15 -。我可以自己解析这些值,但捕获它们看起来比我预期的要难。谢谢您的帮助!
查看完整描述

1 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

使用此代码,我将所有部分作为单独的元素。


第一:只有一个divwithid="team_stats"所以我用find()而不是find_all()


而不是 searchigdiv我搜索td并使用get_text()我在单元格中获取全文。这样我就不需要递归嵌套<div>,也不会从 empty 得到空字符串<div>。


从表格中的所有单元格中获取所有文本后,我将其拆分为较小的部分并清理它们。


我将其拆分—以获取53%和8 of 15作为单独的元素。但这—是不正常的-,所以我手动将它从 HTML 复制/粘贴到代码中。


我发现还有带有代码的字符'\xa0'(可以是“不间断空格”或类似的东西),我使用它清理它strip('\xa0')- 我也可以使用rstrip()/lstrip()或replace()`` or slice it with[1:] and[:-1]`。


from bs4 import BeautifulSoup as BS

import requests 


url = 'https://fbref.com/en/matches/033092ef/Northampton-Town-Lincoln-City-August-4-2018-League-Two'


response = requests.get(url)

soup = BS(response.content, 'html.parser')


# --- getting data ---


data = []


stats = soup.find('div', id="team_stats")


for row in stats.find_all('td'):

    text = row.get_text(strip=True)

    data.append(text)


# --- splitting and cleaning data ---


print('Possession:', data[0], '|', data[1])


text1, percent1 = data[2].split('—')

percent2, text2 = data[3].split('—')

text1 = text1.strip('\xa0')

text2 = text2.strip('\xa0')

print('Shots on Target:', text1, '|', percent1, '|', text2, '|', percent2)


text1, percent1 = data[4].split('—')

percent2, text2 = data[5].split('—')

text1 = text1.strip('\xa0')

text2 = text2.strip('\xa0')

print('Saves:', text1, '|', percent1, '|', text2, '|', percent2)

结果:


Possession: 58% | 42%

Shots on Target: 8 of 15 | 53% | 2 of 4 | 50%

Saves: 1 of 2 | 50% | 8 of 8 | 100%


查看完整回答
反对 回复 2022-06-02
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信