我正在尝试从这个页面http://www.afl.com.au/afl/stats/player-ratings/overall-standings#访问表格中的内容,但是当我在python中使用漂亮的汤时这样做时,我得到的数据却来自“全部”过滤器选择而不是来自某个俱乐部过滤。我怎样才能实现目标?
我需要访问与过滤器中的俱乐部相对应的表格中的所有数据。请帮帮我。
请参阅下图。
以及所有网页的数据:
我使用了以下代码
from bs4 import BeautifulSoup
import urllib2
import lxml.html
import xlwt
import unicodedata
infoList = []
lLink = "http://www.afl.com.au/afl/stats/player-ratings/overall-standings#club/CD_T140"
header = {'User-Agent': 'Mozilla/5.0'}
req_for_players = urllib2.Request(lLink,headers=header)
page_for_players = urllib2.urlopen(req_for_players)
soup_for_players = BeautifulSoup(page_for_players)
table = soup_for_players.select('table.player-ratings')[0]
for group_header in table.select('tbody tr span'):
player = group_header.string
infoList.append(player)
print infoList
由此生成的列表infoList
包含与“全部”过滤器对应的数据。但我想根据我选择的过滤器获取数据。
答案 0 :(得分:0)
您不需要解析表格 - 使用Firebug或任何类似的工具在点击分页器中的某个页面时观察响应,您将看到它为您提供JSON数据!纯粹的胜利!!!
在那里你可以看到JSON数据的URL格式:
http://www.afl.com.au/api/cfs/afl/playerRatings?roundId=CD_R201401411&pageSize=40&pageNum=2
这样你甚至可以在不解析HTML的情况下获取第一页数据,也可以通过将一些高值设置为pageSize
变量来一次获取所有数据
答案 1 :(得分:0)
当页面第一次加载时,无论您选择哪种过滤器,所有玩家都在桌面上。过滤器仅在稍后调用。这就是为什么你要获得所有球员的数据。
在调用过滤器时,页面下面调用以下内容:
http://www.afl.com.au/api/cfs/afl/playerRatings?roundId=CD_R201401411&teamId=CD_T140&pageSize=40&pageNum=1
获得一支球队的球员。在这种情况下,CD_T140
是西方斗牛犬。您可以在selLadderTeam
select元素中查看不同的可能值。您不能简单地调用此URL,因为您将收到401错误。查看发送的标头,有一个突出显示。似乎需要一个令牌。因此,使用requests库(它比urllib2更加用户友好),您可以执行以下操作:
>>> import requests
>>> url = "http://www.afl.com.au/api/cfs/afl/playerRatings?roundId=CD_R201401411&teamId=CD_T40&pageSize=100"
>>> h = {'x-media-mis-token':'e61767b39a7680235476bb33aa946c0e'}
>>> r = requests.get(url, headers=h)
>>> r
<Response [200]>
>>> j = r.json()
>>> len(j['playerRatings'])
45
>>> j['playerRatings'][0]
{u'roundId': u'CD_R201401411', u'player': {u'playerId': u'CD_I260257', u'playerName': {u'givenName': u'Scott', u'surname': u'Pendlebury'}, u'captain': False, u'playerJumperNumber': None}, u'draftYear': u'2005', u'detailedRatings': [{u'trend': u'NO_CHANGE', u'ranking': 2, u'ratingType': u'OVERALL', u'ratingPoints': 674}, {u'trend': u'NO_CHANGE', u'ranking': 1, u'ratingType': u'TEAM', u'ratingPoints': 674}, {u'trend': u'NO_CHANGE', u'ranking': 2, u'ratingType': u'POSITION', u'ratingPoints': 674}], u'team': {u'teamId': u'CD_T40', u'teamName': u'Collingwood', u'teamAbbr': u'COLL', u'teamNickname': u'Magpies'}, u'position': u'MIDFIELDER'}
>>> j['playerRatings'][44]
{u'roundId': u'CD_R201401411', u'player': {u'playerId': u'CD_I295012', u'playerName': {u'givenName': u'Matt', u'surname': u'Scharenberg'}, u'captain': False, u'playerJumperNumber': None}, u'draftYear': u'2013', u'detailedRatings': [{u'trend': u'NO_CHANGE', u'ranking': 0, u'ratingType': u'OVERALL', u'ratingPoints': 0},{u'trend': u'NO_CHANGE', u'ranking': 0, u'ratingType': u'TEAM', u'ratingPoints': 0}, {u'trend': u'NO_CHANGE', u'ranking': 0, u'ratingType': u'POSITION', u'ratingPoints': 0}], u'team': {u'teamId': u'CD_T40', u'teamName': u'Collingwood', u'teamAbbr': u'COLL', u'teamNickname': u'Magpies'}, u'position': u'MEDIUM_DEFENDER'}
>>>
注意:我不确切知道roundID是什么。我将pageSize增加到可能会返回所有团队成员并删除pageNum的内容。他们可以随时更改令牌。