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]:
{'age': 12,
 'boardgameartist': [{'name': 'Pete Abrams', 'objectid': '67538'},
  {'name': 'Wan Chiu', 'objectid': '11821'},
  {'name': 'Nicols Eskubi', 'objectid': '11857'},
  {'name': 'David Julien', 'objectid': '12341'},
  {'name': 'Marc von Martial', 'objectid': '12340'}],
 'boardgamecategory': [{'name': 'Expansion for Base-game', 'objectid': '1042'},
  {'name': 'Wargame', 'objectid': '1019'},
  {'name': 'World War II', 'objectid': '1049'}],
 'boardgamedesigner': [{'name': 'Dale Holmstrom', 'objectid': '8788'},
  {'name': 'Jeff Lewis', 'objectid': '26104'},
  {'name': 'Mark H. Walker', 'objectid': '2343'}],
 'boardgameexpansion': [{'name': 'Band of Heroes Normandy',
   'objectid': '150005'},
  {'name': "Lock 'n Load: Heroes of the Blitzkrieg", 'objectid': '28284'}],
 'boardgamefamily': [{'name': "Lock 'n Load", 'objectid': '126'}],
 'boardgamemechanic': [{'name': 'Hex-and-Counter', 'objectid': '2026'}],
 'boardgamepublisher': [{'name': "Lock 'n Load Publishing, LLC.",
   'objectid': '6025'}],
 'boardgamesubdomain': [],
 'image': 'http://cf.geekdo-images.com/images/pic1194127.jpg',
 'language_dependence': None,
 'maxplayers': 2,
 'minplayers': 1,
 'name': 'Lock n Load: In Defeat, Defiance',
 'objectid': 115313,
 'playingtime': 90,
 'thumbnail': 'http://cf.geekdo-images.com/images/pic1194127_t.jpg',
 'yearpublished': 2012}

In [ ]: