In [12]:
import operator
import requests
import xml.etree.ElementTree as ET
def get_game(id):
url = "http://www.boardgamegeek.com/xmlapi/boardgame/%s" % id
response = requests.get(url).text.encode("ascii", "ignore")
root = ET.fromstring(response)
return _get_game_info(root)
def _get_game_info(root):
for boardgame in root.findall('boardgame'):
item = {}
id = int(boardgame.attrib['objectid'])
item['objectid'] = id
# get language dependence poll
language_dependence = []
poll = boardgame.find('poll[@name="language_dependence"]')
for x in poll.findall('results'):
for r in x.findall('result'):
language_dependence.append(r.attrib)
item['language_dependence'] = _get_best_poll_result(language_dependence)
yearpublished = int(boardgame.find('yearpublished').text)
minplayers = int(boardgame.find('minplayers').text)
maxplayers = int(boardgame.find('maxplayers').text)
playingtime = int(boardgame.find('playingtime').text)
age = int(boardgame.find('age').text)
item['yearpublished'] = yearpublished if yearpublished != 0 else False
item['minplayers'] = minplayers
item['maxplayers'] = maxplayers
item['playingtime'] = playingtime
item['age'] = age
item['name'] = boardgame.find('name[@primary="true"]').text
try:
item['thumbnail'] = boardgame.find('thumbnail').text
except:
item['thumbnail'] = False
try:
item['image'] = boardgame.find('image').text
except:
item['image'] = False
item['boardgamepublisher'] = _get_multiple_data(boardgame, 'boardgamepublisher')
item['boardgamedesigner'] = _get_multiple_data(boardgame, 'boardgamedesigner')
item['boardgameartist'] = _get_multiple_data(boardgame, 'boardgameartist')
item['boardgameexpansion'] = _get_multiple_data(boardgame, 'boardgameexpansion')
item['boardgamecategory'] = _get_multiple_data(boardgame, 'boardgamecategory')
item['boardgamemechanic'] = _get_multiple_data(boardgame, 'boardgamemechanic')
item['boardgamesubdomain'] = _get_multiple_data(boardgame, 'boardgamesubdomain')
item['boardgamefamily'] = _get_multiple_data(boardgame, 'boardgamefamily')
return item
def _get_multiple_data(boardgame, params):
items = []
for item in boardgame.findall(params):
items.append({'name': item.text, 'objectid': item.attrib['objectid']})
return items
def _get_best_poll_result(item):
data = {}
result = None
for x in item:
data[x['value']] = int(x['numvotes'])
result = max(data.iteritems(), key=operator.itemgetter(1))[0]
return result
In [13]:
get_game(115313)
Out[13]:
In [ ]: