Advertisement
stuppid_bot

Form serialize

May 20th, 2015
359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.66 KB | None | 0 0
  1. def serialize_form(form):
  2.     import bs4.element
  3.  
  4.     def _add(name, value):
  5.         if name in data:
  6.             if not isinstance(data, list):
  7.                 # конвертируем в список
  8.                 data[name] = [data[name]]
  9.  
  10.             data[name].append(value)
  11.         else:
  12.             data[name] = value
  13.  
  14.     assert isinstance(form, bs4.element.Tag) and form.name == 'form'
  15.     # теги которые ищем
  16.     tags = ['input', 'textarea', 'select', 'button']
  17.     # ищем только те элементы, которые имеют атрибут `name` и не имеют атрибута
  18.     # `disabled`
  19.     elements = form.findAll(tags, dict(name=True, disabled=False))
  20.     data = {}
  21.    
  22.     for element in elements:
  23.         tag = element.name
  24.         name = element['name']
  25.  
  26.         if tag == 'input':
  27.             # если имя переменной совпадает с ключевым словом либо названием
  28.             # встроенной функции добавляем к названию подчеркивание
  29.             type_ = element.get('type').lower()
  30.  
  31.             if type_ == 'file':
  32.                 continue
  33.  
  34.             if type_ == 'checkbox' or type_ == 'radio':
  35.                 if element.has_attr('checked'):
  36.                     # по-умолчанию значение у чекбоксов и радио-кнопок `on`
  37.                     _add(name, element.get('value', 'on'))
  38.             else:
  39.                 _add(name, element.get('value', ''))
  40.         elif tag == 'textarea':
  41.             _add(name, element.text)
  42.         elif tag == 'select':
  43.             if element.has_attr('multiple'):
  44.                 selected = element.findAll('option', selected=True)
  45.  
  46.                 for option in selected:
  47.                     # если не задан атрибут `value`, то передается содержимое
  48.                     _add(name, option.get('value', option.text))
  49.                 else:
  50.                     # ничего не выбрано добавляем пустую строку
  51.                     _add(name, '')
  52.             else:
  53.                 selected = element.find('option', selected=True)
  54.                 value = selected.get('value', selected.text)\
  55.                         if selected else ''
  56.                 _add(name, value)
  57.         elif tag == 'button':
  58.             # Возможен такой вариант:
  59.             #     <button><img src="path/to/image"></button>
  60.             # Как его обрабатывать я не знаю.
  61.             _add(name, element.get('value', element.text))
  62.  
  63.     return data
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement