def get_effects(head): effects = [] # かならず「減少/増加」効果がある前提で実装している node = head.findNext(lambda tag: tag.name == 'span' and tag.find(text=re.compile(u'減少|増加'))) if not node: logging.warning(u'効果が存在しません: ' + parse_helper.get_string(head)); return effects for effect in node.parent.findAll('span'): effect = parse_helper.parse_effect(parse_helper.get_string(effect)) if effect: effects.append(effect) return effects
def parse_upgrade_sequences(self, body, upgrades): '''おすすめ改造を解析し、 Weapon として登録する ''' try: seq_name_re = re.compile(ur'(.*式.*)') seqs = body.findAll(lambda tag: tag.name == u'h4' and tag.find(text = seq_name_re)) list = [] for seq in seqs: name = get_string(seq) text = get_string(seq.findNext('p', 'quotation')) seq = self.parse_upgrade_sequence(text, upgrades) list.append({'name': name, 'upgrades': seq}) return list except Exception, e: raise ParseException(u'改造式の解析に失敗しました, %s' % e.message)
def parse_basic_info(self, body, item): '''武器の基本情報を解析し、 item へ登録''' table = body.findAll('table')[0] item['category'] = get_string(get_td(table, u'分類')) item['range'] = to_int(get_td(table, u'射程')) item['attack'] = to_min_max(get_td(table, u'攻撃')) item['durability'] = to_int(get_td(table, u'耐久')) item['wound'] = to_min_max(get_td(table, u'負傷率')) item['critical'] = to_int(get_td(table, u'クリティカル')) item['balance'] = to_int(get_td(table, u'バランス')) item['ug'] = to_int(get_td(table, u'UG'))
def parse_upgrades(self, table): '''改造情報を解析する''' result = [] for tr in table.tbody('tr'): if len(tr) < 5: continue item = {} item['name'] = get_string(tr('td')[0]) item['proficiency'] = to_int(tr('td')[1]) item['ug'] = to_min_max(tr('td')[3]) item['cost'] = to_cost(tr('td')[4]) item['effects'] = self.parse_effects(tr('td')[2]) result.append(item) return result
def parse_item(self, table): '''1アイテムパースする''' header_name = ['h2', 'h3', 'h4'] #a = th.findNext('td').find('a') header = table.findPrevious(header_name) item = {} name = self.parse_header(parse_helper.get_string(header)) item['name'] = name td = parse_helper.get_td(table, u'詳細ページ') if td: if not td.a: logging.warning(u'詳細ページがありません: ' + name) else: url = td.a['href'] item['url'] = url return item
def get_item(head): '''タイトル情報を取得する''' try: name = get_name(head) if not name: return None item = {'name': name} if name not in no_effect_titles: item['effects'] = get_effects(head) else: item['effects'] = [] return item except ParseException, e: e = ParseException(parse_helper.get_string(head) + u' ' + e.message) # print e.message raise e
def get_name(head): '''タイトルの名称を取得する''' s = parse_helper.get_string(head) m = name_re.match(s) s = m.group(1) return s