def get_offices(self): points = [] point = Point() point.prov = self.uid point.type = TYPE_OFFICE point.name = u'Главный офис' point.address = u'г. Минск, ул. Тимирязева, 65а' point.place = u'второй этаж' point.phones = [u'+375173121012', u'+375172863333'] point.time = u'пн-чт: 08:30-17:30, пт: 08:30-16:15, перерыв: 13:00-13:45' point.check_information = CHECK_OFFICIAL if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) points.append(point) point = Point() point.prov = self.uid point.type = TYPE_OFFICE point.name = u'ЦБУ №1' point.address = u'г. Минск, ул. Комсомольская, 26' point.phones = [u'+375172202622', u'+375172202722', u'+375172202422'] point.time = u'пн-чт: 09:00-16:30, пт и предпраздничные дни: 09:30-15:00, перерыв: 13:00-13:45' point.check_information = CHECK_OFFICIAL if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) points.append(point) return points
def __parse_base(self, item, city, point_type): point = Point() point.prov = self.uid point.type = point_type point.name = normalize_text(item('.b-map-side>h5').text()) point.address, point.place = split_address_place(u'г. %s, %s' % (city, item('.b-map-side>p span:eq(0)').text())) coordinates = item('.b-map-side>p span:eq(1)').text() if coordinates: point.lat, point.lng = map(strip, coordinates.split(',')) text_html = replace_br(item('.b-map-side-more').html(), ';;;') time_items = [] for sub_item in map(normalize_text, PQ(text_html).text().split(';;;')): if not sub_item: continue if sub_item.startswith(u'Телефон:'): point.phones = normalize_phones(sub_item[len(u'Телефон:')].split(',')) continue time_items.append(sub_item) point.time = normalize_time(', '.join(time_items)) point.check_information = CHECK_OFFICIAL if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) return point
def __parse_base_atm_terminal(self, row, point_type, coordinates, deposit=False): point = Point() point.prov = self.uid point.type = point_type point.name = normalize_text(u'№' + str(int(row[1]))) city = row[2] if u'р-н' not in row[2]: city = u'г. %s' % city point.address = normalize_address(u'%s, %s' % (city, row[3])) point.place = normalize_text(row[4]) if u'только безнал.платежи' in row[5]: point.currency = [] if deposit: point.deposit = False else: point.currency = map(strip, row[5].split(',')) if deposit: point.deposit = True point.time = normalize_time(row[6]) point.check_information = CHECK_OFFICIAL point.lat, point.lng = self.__get_point_coordinate(point.address, coordinates) if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) return point
def __parse_base_office_exchange(self, item, point_type, name_keywords): point = Point() point.prov = self.uid point.type = point_type point.name = normalize_text(item('th:eq(0) a:eq(0)').text()) if not point.name.startswith(name_keywords): return None city = normalize_text(item('td:eq(1)').text()) address = normalize_text(item('td:eq(2)').text()) point.address, point.place = split_address_place(u'г. %s, %s' % (city, address)) point.check_information = CHECK_OFFICIAL for lat, lng, type_id, description in self.__get_coordinates(): if u'Минск' not in point.address or type_id != '1': continue for token in description.split(): if token not in point.address and token not in point.name: break else: point.lat = lat point.lng = lng point.check_coordinates = CHECK_OFFICIAL break else: warning_not_official_coordinates(point) return point
def __get_offices(self, url, city_name=''): points = [] page = PQ(get_url(url).decode('utf8')) time = None for item in map(PQ, page('#oo__content_value table tr:gt(0)')): if item('td').attr('colspan') == '3': continue point = Point() point.prov = self.uid point.type = TYPE_OFFICE point.name = normalize_text(item('td:eq(0)').text()) point.address = normalize_address(city_name + item('td:eq(1) p:eq(0)').text()) place = item('td:eq(1) p:eq(2)').text() if not place: place = item('td:eq(1) p:eq(1)').text() if place: point.place = normalize_text(place) new_time = item('td:eq(2)').text() if new_time: time = new_time point.time = normalize_time(time) point.check_information = CHECK_OFFICIAL if point.address in self.__addresses: point.lat, point.lng = self.__addresses[point.address] point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) points.append(point) return points
def __parse_base_office_exchange(self, item, map_points, point_type, start_names): point = Point() point.prov = self.uid point.type = point_type point.name = normalize_text(item('.name').text()) if not point.name.startswith(start_names): return None point.address, point.place = split_address_place(item('.addres strong').text()) sub_item = item('.item_block tr:last') point.phones = normalize_phones(sub_item('td:eq(0)').text().split(',')) mon_thu = u'пн-чт: ' + sub_item('td:eq(2)').text() fri = u'пт: ' + sub_item('td:eq(3)').text() sat = u'сб: ' + sub_item('td:eq(4)').text() sun = u'вс: ' + sub_item('td:eq(5)').text() point.time = normalize_time(', '.join([mon_thu, fri, sat, sun])) point.check_information = CHECK_OFFICIAL for lng, lat, name, address, place in map_points: if (point.name in name if point.name and name else True) and\ (point.address and address and point.address in address) and\ (point.place in place if point.place and place else True): point.lat = lat point.lng = lng point.check_coordinates = CHECK_OFFICIAL break else: warning_not_official_coordinates(point) return point
def get_offices(self): points = [] point = Point() point.prov = self.uid point.type = TYPE_OFFICE point.name = u'Головное отделение' point.address = u'г. Минск, ул. Некрасова, 114' point.lat = 53.940182 point.lng = 27.56712 point.phones = [u'88011006000'] point.time = u'пн-чт: 09.00-17.00, перерыв: 13.00-13.50, пт и предпраздничные дни: 09.00-16.00, перерыв: 13.00-13.40, сб, вс: выходные' point.check_coordinates = CHECK_OFFICIAL point.check_information = CHECK_OFFICIAL points.append(point) page = PQ(get_url(self.__parse_data_office_cbu_url)) for item in map(PQ, page('.itemFilial')): point = self.__parse_office(item) if point: points.append(point) page = PQ(get_url(self.__parse_data_office_retail_url)) for item in map(PQ, page('.itemFilial')): point = self.__parse_office(item) if point: points.append(point) return points
def __parse_base(self, item, city_name, point_type): point = Point() point.prov = self.uid point.type = point_type point.phones = [normalize_phone(item('.content_table table tbody tr:eq(0) td:eq(0) .office_phone').remove().text())] name_address_html = replace_br(item('.content_table table tbody tr:eq(0) td:eq(0)').remove().html(), ',') name, address = PQ(name_address_html).text().split(',', 1) point.name = normalize_text(name) point.address, point.place = self.__get_address(city_name, address) point.check_information = CHECK_OFFICIAL script_text = item('.ya_map script:eq(1)').text() for line in map(strip, script_text.splitlines()): if line.startswith('BX_GMapAddPlacemark('): lat_token = "'LAT':'" lat_start_index = line.find(lat_token) + len(lat_token) lat_end_index = line.find("'", lat_start_index) point.lat = line[lat_start_index:lat_end_index] lng_token = "'LON':'" lng_start_index = line.find(lng_token) + len(lng_token) lng_end_index = line.find("'", lng_start_index) point.lng = line[lng_start_index:lng_end_index] point.check_coordinates = CHECK_OFFICIAL break else: warning_not_official_coordinates(point) return point
def __parse_terminal(self, item): point = Point() point.prov = self.uid point.type = TYPE_TERMINAL city = normalize_text(item('td:eq(0)').text()) address = normalize_text(item('td:eq(2)').text()) point.address, point.place = split_address_place(u'г. %s, %s' % (city.title(), address)) point.place = normalize_text(item('td:eq(1)').text()) point.time = normalize_time(item('td:eq(3)').text()) point.check_information = CHECK_OFFICIAL for lat, lng, type_id, description in self.__get_coordinates(): if u'Минск' not in point.address or type_id != '2': continue for token in description.split(): if token not in point.address: break else: point.lat = lat point.lng = lng point.check_coordinates = CHECK_OFFICIAL break else: warning_not_official_coordinates(point) return point
def __parse_base(self, item, city_name, point_type): point = Point() point.prov = self.uid point.type = point_type point.address, point.place = self.__parse_address(city_name, item('td:eq(0) a').text()) point.check_information = CHECK_OFFICIAL point.lat = item('td:eq(0) .item_coords .coord1').text() point.lng = item('td:eq(0) .item_coords .coord2').text() if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) return point
def __parse_atm(self, item, city, coordinates): point = Point() point.prov = self.uid point.type = TYPE_ATM point.address = normalize_address(u'%s, %s' % (city, item('td:eq(2)').text())) point.place = normalize_text(item('td:eq(1)').text()) point.currency = map(strip, item('td:eq(4)').text().replace('EURO', 'EUR').split(',')) point.time = normalize_time(item('td:eq(3)').text()) point.check_information = CHECK_OFFICIAL point.lat, point.lng = self.__get_point_coordinate(point, coordinates) if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) return point
def __parse_office_main(self, coordinates): point = Point() point.prov = self.uid point.type = TYPE_OFFICE point.name = u'Центральный офис' point.address = u'г. Минск, ул. В.Хоружей, 31а' point.phones = [u'+375172899090', u'+375172899292'] point.time = u'пн-чт: 08:30-17:30, пт: 08:30-16:15, перерыв: 12:30-13:15, сб, вс: выходной' point.check_information = CHECK_OFFICIAL point.lat, point.lng = self.__get_point_coordinate(point.address, coordinates) if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) return point
def get_atms(self): points = [] page = PQ(get_url(self.__parse_list_atm_url).decode('utf8')) for item in map(PQ, page('#oo__content_value table tr:gt(0)')): point = Point() point.prov = self.uid point.type = TYPE_ATM point.address = normalize_address(item('td:eq(0) p:eq(0)').text()) point.place = normalize_text(item('td:eq(1)').text()) point.time = normalize_time(item('td:eq(2)').text()) point.currency = map(self.__get_currency, item('td:eq(3) p')) point.check_information = CHECK_OFFICIAL if point.address in self.__addresses: point.lat, point.lng = self.__addresses[point.address] point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) points.append(point) return points
def __parse_office(self, item, city): point = Point() point.prov = self.uid point.type = TYPE_OFFICE point.name = normalize_text(item('th .pointShowMaps span:eq(0)').text()) address = item('th .pointShowMaps span:eq(1)').text() point.address, point.place = split_address_place(u'г. %s, %s' % (city, address)) time_html = replace_br(item('td:eq(0)').html(), ', ') point.time = normalize_time(PQ(time_html).text()) phones_html = replace_br(item('td:eq(1)').html(), ', ') point.phones = normalize_phones(PQ(phones_html).text().split(',')) point.lat = normalize_text(item('th .item_coords .coord1').text()) point.lng = normalize_text(item('th .item_coords .coord2').text()) point.check_information = CHECK_OFFICIAL if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) return point
def get_exchanges(self): points = [] page = PQ(get_url(self.__parse_list_exchange_url).decode('utf8')) for item in map(PQ, page('#oo__content_value table tr:gt(0)')): point = Point() point.prov = self.uid point.type = TYPE_EXCHANGE add_city_literal = (u'Минск', u'Витебск') address = normalize_text(item('td:eq(0)').text()) point.address = normalize_address((u'г. ' + address) if address.startswith(add_city_literal) else address) point.place = normalize_text(item('td:eq(1)').text()) point.time = normalize_time(item('td:eq(2)').text()) point.check_information = CHECK_OFFICIAL if point.address in self.__addresses: point.lat, point.lng = self.__addresses[point.address] point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) points.append(point) return points
def __parse_exchange(self, item): point = Point() point.prov = self.uid point.type = TYPE_EXCHANGE point.name = normalize_text(item.find('name').text) city = item.find('region').text if item.find('region') else u'Минск' address = item.find('address').text point.address = normalize_address(u'г. %s, %s' % (city.title(), address)) point.place = normalize_text(item.find('location').text) point.lat = item.find('lattitude').text point.lng = item.find('longitude').text point.time = normalize_time(item.find('time').text) if item.find('phones').text: point.phones = normalize_phones(item.find('phones').text.split(',')) point.check_information = CHECK_OFFICIAL if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) return point
def __parse_base_atm_terminals(self, item, map_points, point_type, start_names): point = Point() point.prov = self.uid point.type = point_type if not item('.name').text().split()[0].startswith(start_names): return None point.address, point.place = split_address_place(' '.join(item('.name').text().strip().split()[1:])) point.place = trim_spaces_and_commas(normalize_text(item('.addres strong').text())) point.check_information = CHECK_OFFICIAL for lat, lng, name, address, place in map_points: if (name in start_names) and\ (point.address and address and point.address in address) and\ (point.place in place if point.place and place else True): point.lat = lat point.lng = lng point.check_coordinates = CHECK_OFFICIAL break else: warning_not_official_coordinates(point) return point
def __parse_office_exchange(self, item, city, coordinates, point_type, point_keywords): point = Point() point.prov = self.uid point.type = point_type point.name = normalize_text(item('th:eq(0)').text()) if not point.name.startswith(point_keywords): return None address_html = replace_br(item('td:eq(0)').html(), ';;;') address_items = PQ(address_html).text().split(';;;', 1) point.address = normalize_address(u'%s, %s' % (city, address_items[0])) if len(address_items) > 1: point.place = normalize_text(address_items[1]) item('td:eq(1) ul, td:eq(1) li').remove() point.time = normalize_time(item('td:eq(1)').text()) point.phones = normalize_phones(map(lambda phone_item: PQ(phone_item).text(), item('td:eq(2) p') or item('td:eq(2)'))) point.check_information = CHECK_OFFICIAL point.lat, point.lng = self.__get_point_coordinate(point, coordinates) if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) return point
def __parse_atm(self, item, city): point = Point() point.prov = self.uid point.type = TYPE_ATM address = item('th .pointShowMaps span').remove().text() place = normalize_text(item('th .pointShowMaps').text()) point.address, point.place = split_address_place(u'г. %s, %s' % (city, address)) point.place = place currency = item('td:eq(0)').text() for from_token, to_token in self.__currency_replaces: currency = currency.replace(from_token, to_token) point.currency = map(strip, currency.split(',')) time_html = replace_br(item('td:eq(1)').html(), ', ') point.time = normalize_time(PQ(time_html).text()) point.lat = normalize_text(item('th .item_coords .coord1').text()) point.lng = normalize_text(item('th .item_coords .coord2').text()) point.check_information = CHECK_OFFICIAL if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) return point
def __parse_atm(self, item, coordinates): point = Point() point.prov = self.uid point.type = TYPE_ATM bank = item.find('bank').text if bank != u'ЗАО БелСвиссБанк': return None city = item.find('region').text address = item.find('address').text point.address = normalize_address(u'г. %s, %s' % (city.title(), address)) point.place = normalize_text(item.find('location').text) point.time = normalize_time(item.find('time').text) point.currency = map(strip, item.find('currency').text.split(',')) point.check_information = CHECK_OFFICIAL terminal_id = item.find('terminal_id').text if terminal_id in coordinates: point.lat, point.lng = coordinates[terminal_id] if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) return point
def get_atms(self): points = [] point = Point() point.prov = self.uid point.type = TYPE_ATM point.name = u'АТМ 12149' point.address = u'г. Минск, ул. Некрасова, 114' point.lat = 53.940182 point.lng = 27.56712 point.time = u'ежедневно: 24 часа' point.check_coordinates = CHECK_OFFICIAL point.check_information = CHECK_OFFICIAL points.append(point) point = Point() point.prov = self.uid point.type = TYPE_ATM point.name = u'АТМ 12152' point.address = u'г.Минск, ул. Куйбышева, д.40, 2 ряд, 7 место' point.place = u'торговое место 27' point.lat = 53.921251 point.lng = 27.578332 point.time = u'вт-вс: 10:00-20:00, пн: выходной' point.check_coordinates = CHECK_OFFICIAL point.check_information = CHECK_OFFICIAL points.append(point) point = Point() point.prov = self.uid point.type = TYPE_ATM point.name = u'АТМ 12150' point.address = u'г. Минск, ул. Я.Лучины, 44' point.lat = 53.839188 point.lng = 27.581946 point.time = u'ежедневно: 08:00-23:00' point.check_coordinates = CHECK_OFFICIAL point.check_information = CHECK_OFFICIAL points.append(point) point = Point() point.prov = self.uid point.type = TYPE_ATM point.name = u'АТМ 12151' point.address = u'г. Бобруйск, ул. Социалистическая, 65/46' point.lat = 53.132159 point.lng = 29.226754 point.time = u'ежедневно: 24 часа' point.check_coordinates = CHECK_OFFICIAL point.check_information = CHECK_OFFICIAL points.append(point) point = Point() point.prov = self.uid point.type = TYPE_ATM point.name = u'АТМ 12153' point.address = u'г. Гродно, ул. Советских пограничников, 31' point.place = u'кафе Колобки' point.lat = 53.668713 point.lng = 23.824421 point.time = u'ежедневно: 24 часа' point.check_coordinates = CHECK_OFFICIAL point.check_information = CHECK_OFFICIAL points.append(point) return points
def get_offices(self): points = [] coordinates = self.__get_coordinates() regions_page = PQ(get_url(self.__regions_url).decode('cp1251')) for region_item in map(PQ, regions_page('#ctl47_Panel_Viewer .rsf-content-menu a')): region_url = self.site + region_item.attr('href') offices_page = PQ(get_url(region_url).decode('cp1251')) for item in map(PQ, offices_page('#Print_2_ctl39 table')): if not normalize_text(item.text()): continue is_main = u'Центральный офис' in item('tr:eq(0)').text() offices_url = self.site + '/' + item('tr:eq(2) a').attr('href') page = PQ(get_url(offices_url).decode('cp1251')) if is_main: point = self.__parse_office_main(coordinates) if point: points.append(point) else: point = None start_times = False time_items = [] for item in map(PQ, page('#Print_2_ctl39 tr:gt(1)')): if len(item('td')) >= 4: if point: point.time = normalize_time(', '.join(time_items)) point.lat, point.lng = self.__get_point_coordinate(point.address, coordinates) if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) points.append(point) point = None start_times = False time_items = [] name = normalize_text(item('td:eq(0)').text()) if not name: continue point = Point() point.prov = self.uid point.type = TYPE_OFFICE point.check_information = CHECK_OFFICIAL point.name = u'№%s' % name address_html = item('td:eq(1) p:eq(0)').html() if address_html: address_html = address_html.strip() if not address_html: address_html = item('td:eq(1)').html() image_tag_start = address_html.find('<img') if image_tag_start > 0: address_html = address_html[:image_tag_start] atm_text_start = address_html.find(u'Банкомат') if atm_text_start > 0: address_html = address_html[:atm_text_start] point.address, point.place = split_address_place(PQ(address_html).text().split(';;;')[0]) if point.address.endswith(u'А'): point.address = point.address[:-1] + u'а' if point.address.endswith(u'Б'): point.address = point.address[:-1] + u'б' if point.address.endswith(u'-а'): point.address = point.address[:-2] + u'а' for from_token, to_token in self.__address_replaces: point.address = point.address.replace(from_token, to_token) item('td:eq(0), td:eq(1)').remove() next_sub_item = normalize_text(item('td:eq(0)').text()).lower() if not next_sub_item.startswith(self.__start_offices_keywords) and\ not next_sub_item.startswith(self.__stop_offices_keywords): start_times = True if start_times and len(item('td')) >= 2: time_items.append(u'%s: %s' % (item('td:eq(0)').text(), item('td:eq(1)').text())) point.phones = self.__parse_phones(item) if not point: continue item_text = normalize_text(item.text()) if not item_text or item_text.startswith(u'г.'): continue for sub_item in map(PQ, item('td')): if not normalize_text(sub_item.text()): sub_item.remove() next_sub_item = normalize_text(item('td:eq(0)').text()).lower() if start_times and next_sub_item.startswith(self.__stop_offices_keywords): start_times = False continue if not start_times and next_sub_item.startswith(self.__start_offices_keywords): start_times = True point.phones += self.__parse_phones(item) continue if start_times and len(item('td')) >= 2: time_items.append(u'%s: %s' % (item('td:eq(0)').text(), item('td:eq(1)').text())) continue if point: point.time = normalize_time(', '.join(time_items)) point.lat, point.lng = self.__get_point_coordinate(point.address, coordinates) if point.lat and point.lng: point.check_coordinates = CHECK_OFFICIAL else: warning_not_official_coordinates(point) points.append(point) return points