如何通过网络抓取表格中的特定列?

时间:2021-06-28 02:13:19

标签: python web-scraping

我正在尝试通过网络抓取特定列中的篮球运动员列表。我可以得到第一个球员,但之后就没有其他球员了。我需要以字符串形式获取整个玩家列表。到目前为止,这是我的代码:

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] 但这没有用。

4 个答案:

答案 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)