Skip to content

Instantly share code, notes, and snippets.

@wiiaboo
Created May 3, 2014 22:29
Show Gist options
  • Save wiiaboo/11507232 to your computer and use it in GitHub Desktop.
Save wiiaboo/11507232 to your computer and use it in GitHub Desktop.
# 1. "get information from google"
# 2. "parse json/xml"
# 3. "loop by tier"
# 4. "loop by component"
# 5. "split by name and link"
# ---
# Get data from Google Docs, parse the data, split by tier, each tier by components,
# get a component and its name and link.
from xml.dom import minidom
from urllib.request import urlopen
COMPONENTS = ['gpu', 'cpu', 'hsf', 'mobo',
'ram', 'hdd', 'ssd', 'psu', 'case']
TIERS = ['Destitute', 'Poor', 'Minimum', 'Entry', 'Modest',
'Fair', 'Good', 'Very good', 'Great', 'Suberb',
'Excellent', 'Outstanding', 'Exceptional', 'Enthusiast',
'Extremist', 'Monstrous']
def get_text(parent, tagname):
elements = parent.getElementsByTagName(tagname)
if len(elements) != 0:
element = elements[0]
if element.hasChildNodes():
return element.childNodes[0].data
else:
return ""
else:
return ""
class Component(object):
def __init__(self, _type, name, price, link, tier=""):
self.type = _type
self.name = name
self.price = round(float(price) + 0.2)
self.link = link
self.tier = tier
def __eq__(self, other):
return (self.type == other.type and self.name == other.name and
self.price == other.price and self.link == other.link)
def __repr__(self):
return 'Component(name={!r})'.format(self.name)
class Tier(object):
def __init__(self, name):
self.name = name
self.component_list = []
def __contains__(self, other):
if other in self.component_list:
return True
else:
return False
def __eq__(self, other):
return self.name == other.name
def __repr__(self):
return 'Tier(name={!r})'.format(self.name)
def add(self, component):
if component not in self.component_list or component.name != "":
component.tier = self.name
self.component_list.append(component)
def get(self, _type):
result = []
for component in component_list:
if component.type == _type:
result.append(component)
else:
continue
return result
def get_all(self):
return self.component_list
def from_entry(self, entry):
for component in COMPONENTS:
name = get_text(entry, 'gsx:' + component)
price = 0
link = ""
if name not in ["", "Stock", "None"]:
price = get_text(entry, 'gsx:' + component + 'price')
link = get_text(entry, 'gsx:' + component + 'link')
self.add(Component(component, name, price, link, self.name))
else:
continue
class Table(object):
def __init__(self, entries):
self.tiers = {}
prev = ""
for entry in entries:
name = get_text(entry, 'gsx:tier')
if name == "":
tier = self.tiers[prev]
else:
tier = Tier(name)
tier.from_entry(entry)
self.tiers[tier.name] = tier
prev = tier.name
def __getitem__(self, tier):
return self.tiers[tier]
def __repr__(self):
return 'Tiers: {!r}'.format(TIERS)
def get_entries(sheet):
# convert to text
xmldoc = minidom.parse(sheet)
entries = xmldoc.getElementsByTagName('entry')
return entries
sheet_url = "https://spreadsheets.google.com/feeds/list/1eI_N4YWuQRR3fCasrU7w9lDMPo15ayVL-MV40sE794g/od6/public/values"
# sheet_text = urlopen(sheet_url)
sheet_text = "values.xht"
entries = get_entries(sheet_text)
sheet = Table(entries)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment