Advertisement
Guest User

parser.py

a guest
Oct 6th, 2014
366
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.73 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. try:
  3.     from lxml import etree
  4. except ImportError:
  5.     from xml.etree import ElementTree as etree
  6.  
  7.  
  8. # Можно завести словарь, который содержит имена таблиц
  9. REALTY_TYPE_TABLE_NAMES = {
  10.     'Apartment': 'apartment',
  11.     'House': 'house',
  12.     'Nonlive': 'office',
  13.     'Land': 'stead'
  14. }
  15.  
  16. # Поля. которые нужно достать
  17. REQUIRED_PROPERTIES = ['district', 'street', 'price', 'level', 'area_all', 'object_details', 'info']
  18.  
  19.  
  20. # Получаем имя таблицы путём склейки строки. В принципе, можно и через if это делать
  21. def get_table_name(obj_type, obj_realty_type):
  22.     return '_'.join(('maklers', obj_type.lower(), REALTY_TYPE_TABLE_NAMES.get(obj_realty_type, 'unknown')))
  23.  
  24.  
  25. def parse(filename):
  26.     result = list()
  27.  
  28.     tree = etree.parse(filename)
  29.     root = tree.getroot()
  30.     # Корневой элемент содержит список объектов, пробегаем по всем его дочерним элементам
  31.     for obj in root:
  32.         data = dict()
  33.  
  34.         # Всегда проверяем правильность в том месте, где получаем элементы
  35.         try:
  36.             # Аттрибуты xml хранятся в поле 'attrib' в виде словаря
  37.             data['oid'] = obj.attrib['oid']
  38.         except KeyError:
  39.             raise etree.ParseError('Неверный формат xml')
  40.  
  41.         # Получаем дочерний элемент с именем тэга 'object_property'
  42.         prop = obj.find('object_property')
  43.         if prop is None:
  44.             raise etree.ParseError('Неверный формат xml')
  45.  
  46.         try:
  47.             # Записываем в 1 переменную 2 значения (они будут в виде списка)
  48.             obj_types = prop.attrib['type'], prop.attrib['realty_type']
  49.         except KeyError:
  50.             raise etree.ParseError('Неверный формат xml')
  51.         # Разворачиваем список, чтобы передать в функцию
  52.         data['table_name'] = get_table_name(*obj_types)
  53.         try:
  54.             # Пытаемся получить значения всех необходимых атрибутов
  55.             for attr_name in REQUIRED_PROPERTIES:
  56.                     data[attr_name] = prop.attrib[attr_name]
  57.         except KeyError:
  58.             raise etree.ParseError('Неверный формат xml')
  59.         # Если позволительно некоторые атрибуты опустить, то можно сделать немного по-другому:
  60.         #
  61.         # for attr_name, attr_value in prop.attrib.items()
  62.         #     if attr_name in REQUIRED_PROPERTIES:
  63.         #         data[attr_name] = attr_value
  64.  
  65.         # Добавляем текущие данные в список
  66.         result.append(data)
  67.  
  68.         # Хотя лучше возвращать генератор:
  69.         # В конце цикла написать `yield data`
  70.         #  И убрать в конце функции `return result`
  71.         #
  72.         # В основной программе работать с генератором только через for (и другие штуки для итераторов)
  73.         # ибо генератор не хранит все данные.
  74.         # Генератор стоит использовать, если данные нужны только 1 раз (например, чтобы их в БД засунуть)
  75.  
  76.     return result
  77.  
  78.  
  79. if __name__ == '__main__':
  80.     for obj in parse('document.xml'):
  81.         print(obj)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement