使用带有索引的for循环,解析到单独的列表

2024-09-29 06:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个问题,我已经找到了答案,但它的编码方式似乎有点挥之不去,有点资源密集。想看看是否有一种方法,我在概念上认为应该工作,但无法正确编码。你知道吗

问题在于以下代码:

from bs4 import BeautifulSoup as bsoup
import requests as reqs

pagetoparse = 'https://fbref.com/en/squads/986a26c1/Northampton-Town'
page = reqs.get(pagetoparse)
status = page.status_code
parsepage = bsoup(page.content, 'html.parser')

playerlist = []
positionlist = []
agelist = []

# Create playerlist - unique instances
findplayers = parsepage.find_all('th',attrs={"data-stat":"player"})
    for player in findplayers:
        addplayer = player.find_next('a').get_text()
        if addplayer not in playerlist and addplayer != 'coverage note':
            playerlist.append(addplayer)

# Create positionlist - non-unique
findinfo = parsepage.find_all('td',attrs={"data-stat":'position'})
    for position in findinfo:
        addposition = position.get_text()
        if addposition != 'coverage note':
            positionlist.append(addposition)

# Create positionlist - non-unique
findinfo = parsepage.find_all('td',attrs={"data-stat":'age'})
    for age in findinfo:
        addage = age.get_text()
        if addage != 'coverage note':
            agelist.append(addage)

目前我所做的是这样的,这是可行的,但是问题是我更喜欢在索引中运行整个data stat选项:

toparse=['player'、'position'、'age']等

然而,我无法实现这一点的地方是,将这些单独的索引成员添加到各自的列表中。我可以构造一个for循环来实现这一点,但它们最终都位于相同的索引中。在自己的列表中运行data stat变量时,您能帮助使列表也更改为下一个吗?即代码将列表从playerlist交换到position list等?你知道吗

我已经设法分别运行代码来实现这一点。然而,它缺乏灵活性,而且我想说,它变得有点太长,无法管理。你知道吗


Tags: in列表foragedatagetpositionfind
1条回答
网友
1楼 · 发布于 2024-09-29 06:29:26

使用find_next函数获取下一个元素more details

from bs4 import BeautifulSoup as bsoup
import requests as reqs

pagetoparse = 'https://fbref.com/en/squads/986a26c1/Northampton-Town'
page = reqs.get(pagetoparse)
parsepage = bsoup(page.content, 'html.parser')
playerlist = []
findplayers = parsepage.find_all('th',attrs={"data-stat":"player"})

for player in findplayers:
    playerdict = {}
    addplayer = player.find_next('a').get_text()
    if addplayer not in playerlist and addplayer != 'coverage note':
        playerdict['player'] = addplayer
        position,age = player.find_next('td'),player.find_next('td')
        while True:
            position = position.find_next('td')
            if position.has_attr("data-stat") and position['data-stat'] in 'position':
                playerdict['position'] = position.get_text()
                break

        while True:
            position = position.find_next('td')
            if position.has_attr("data-stat") and position['data-stat'] in 'age':
                playerdict['age'] = position.get_text()
                break

        playerlist.append(playerdict)

print(playerlist)

订单号:

[{'player':'David Cornell','position':'GK','age':'27'},{'player':'David Cornell','position':'GK','age':'27'},
{'player':'Aaron Pierre','position':'DF','age':'25'},{'player':'Sam Hoskins','position':'FW','age':'25'},
{'player':'David Buchanan','position':'DF','age':'32'},{'player':'Sam Foley','position':'MF','age':'31'},
{'player':'Ash Taylor','position':'MF,DF','age':'27'},{'player':'Jordan Turnbull','position':'DF','age':'23'},
{'player':'Andy Williams','position':'MF,FW','age':'31'},{'player':"John-Joe O'Toole",'position':'MF','age':'29'},
{'player':'Shay Facey','position':'DF','age':'23'},{'player':'Shaun McWilliams','position':'MF','age':'19'},
{'player':'Kevin van Veen','position':'FW','age':'27'},{'player':'Matt Crooks','position':'MF,DF','age':'24'},
{'player':'Daniel Powell','position':'MF,FW','age':'27'},{'player':'Jack Bridge','position':'FW','age':'22'},
{'player':'Charlie Goode','position':'DF','age':'22'},{'player':'Hakeem Odoffin','position':'DF','age':'20'},
{'player':'Dean Bowditch','position':'FW','age':'32'},{'player':'Junior Morias','position':'FW','age':'23'},
{'player':'Jay Williams','position':'DF','age':''},{'player':'Joe Powell','position':'MF','age':'19'},
{'player':'Billy Waters','position':'MF,FW','age':'23'},{'player':'Marvin Sordell','position':'FW','age':'27'},
{'player':'Timi Elšnik','position':'MF','age':'20'},{'player':'Leon Barnett','position':'DF','age':'32'},
{'player':'Scott Pollock','position':'MF','age':''},{'player':'George Cox','position':'DF','age':''},
{'player':'Ryan Hughes','position':'MF','age':''},{'player':'Morgan Roberts','position':'','age':''},
{'player':'David Cornell','position':'GK','age':'27'},{'player':'David Cornell','position':'GK','age':'27'}]

相关问题 更多 >