【问题标题】:Can't access data from a table in a web page无法从网页中的表格访问数据
【发布时间】:2014-06-08 16:59:44
【问题描述】:

我正在尝试从此页面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 包含与“全部”过滤器对应的数据。但是我想要根据我选择的过滤器的数据。

【问题讨论】:

  • 如果你想要有用的答案,你需要展示一些代码。
  • 我已经添加了我用过的代码。。谢谢

标签: python beautifulsoup


【解决方案1】:

您不需要解析表格 - 使用 Firebug 或任何类似工具来查看响应,同时单击分页器中的某个页面,您会看到它以 JSON 格式为您提供数据!纯赢!!!

在那里你可以看到 JSON 数据的 URL 格式:

http://www.afl.com.au/api/cfs/afl/playerRatings?roundId=CD_R201401411&pageSize=40&pageNum=2

这样你甚至可以在不解析 HTML 的情况下获取第一页数据,也许你可以通过为 pageSize 变量设置一些高值来一次获取所有数据

【讨论】:

  • 什么意思? Chrome 有开发者工具,Firefox 有开发者工具,Opera 有 Firefly 或类似的东西。
【解决方案2】:

第一次加载页面时,无论您选择什么过滤器,所有玩家都在表中。过滤器仅在稍后调用。这就是为什么您要获取所有玩家的数据。

在调用过滤器时,页面下方正在调用以下内容:

http://www.afl.com.au/api/cfs/afl/playerRatings?roundId=CD_R201401411&teamId=CD_T140&pageSize=40&pageNum=1

获得一支球队的球员。 CD_T140 在这种情况下是西方斗牛犬。您可以在 selLadderTeam 选择元素中看到不同的可能值。但是,您不能简单地调用此 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。他们可以随时更改令牌。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多