我正在尝试通过网络抓取特定列中的篮球运动员列表。我可以得到第一个球员,但之后就没有其他球员了。我需要以字符串形式获取整个玩家列表。到目前为止,这是我的代码:
from bs4 import BeautifulSoup
import requests
import pandas as pd
headers = {'User Agent':'Mozilla/5.0'}
url = ("https://www.basketball-reference.com/draft/NBA_2011.html")
res = requests.get(url)
soup = BeautifulSoup(res.content, 'lxml')
header = [th.getText() for th in soup.findAll('tr', limit = 99)[1].findAll('th')[1:]]
header[2]
player = [[td.getText() for td in rows[i].findAll('td')] for i in range(len(rows))]
player[1][2]
player[1][2] 的输出是“Kyrie Irving”,这意味着我在正确的轨道上,但我需要让所有球员都在列中。我试过做 player[::][2] 但这没有用。
答案 0 :(得分:0)
我没有看到在任何地方分配的行。您可以简单地使用 attribute = value 选择器通过 data-stat
属性的值来定位玩家:
import requests
from bs4 import BeautifulSoup as bs
url = 'https://www.basketball-reference.com/draft/NBA_2011.html'
r = requests.get(url)
soup = bs(r.content, 'lxml')
players = [i.text for i in soup.select('[data-stat=player]')][1:] #attribute selector
您也可以使用 :nth-child()
选择器:
players = [i.text for i in soup.select('td:nth-child(4)')]
答案 1 :(得分:0)
import pandas as pd
url = ("https://www.basketball-reference.com/draft/NBA_2011.html")
table = pd.read_html(url)[0]
players_name = table[('Round 1', 'Player')]
for player in players_name:
print(player)
输出:
凯里欧文
德里克·威廉姆斯
埃内斯·坎特
特里斯坦·汤普森
乔纳斯·瓦兰奇尤纳斯
.
.
。 .
答案 2 :(得分:0)
玩家名称出现在 <td>
中,属性 data-stat
等于 player
。
使用 <td>
选择所有具有上述属性的 findAll()
,并从每个 <td>
中提取所有玩家姓名。
import requests
import bs4 as bs
url = 'https://www.basketball-reference.com/draft/NBA_2011.html'
resp = requests.get(url)
soup = bs.BeautifulSoup(resp.text, 'lxml')
players = soup.findAll('td', attrs= {'data-stat': 'player'})
for i in players:
print(i.text)
答案 3 :(得分:0)
让pandas解析表格(过滤掉非名称),然后把它放在一个列表中:
import pandas as pd
draft_df = pd.read_html("https://www.basketball-reference.com/draft/NBA_2011.html")[0]
player_list = list(draft_df[draft_df['Rk'].ne('Rk')]['Player'])
print(player_list)