Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def serialize_form(form):
- import bs4.element
- def _add(name, value):
- if name in data:
- if not isinstance(data, list):
- # конвертируем в список
- data[name] = [data[name]]
- data[name].append(value)
- else:
- data[name] = value
- assert isinstance(form, bs4.element.Tag) and form.name == 'form'
- # теги которые ищем
- tags = ['input', 'textarea', 'select', 'button']
- # ищем только те элементы, которые имеют атрибут `name` и не имеют атрибута
- # `disabled`
- elements = form.findAll(tags, dict(name=True, disabled=False))
- data = {}
- for element in elements:
- tag = element.name
- name = element['name']
- if tag == 'input':
- # если имя переменной совпадает с ключевым словом либо названием
- # встроенной функции добавляем к названию подчеркивание
- type_ = element.get('type').lower()
- if type_ == 'file':
- continue
- if type_ == 'checkbox' or type_ == 'radio':
- if element.has_attr('checked'):
- # по-умолчанию значение у чекбоксов и радио-кнопок `on`
- _add(name, element.get('value', 'on'))
- else:
- _add(name, element.get('value', ''))
- elif tag == 'textarea':
- _add(name, element.text)
- elif tag == 'select':
- if element.has_attr('multiple'):
- selected = element.findAll('option', selected=True)
- for option in selected:
- # если не задан атрибут `value`, то передается содержимое
- _add(name, option.get('value', option.text))
- else:
- # ничего не выбрано добавляем пустую строку
- _add(name, '')
- else:
- selected = element.find('option', selected=True)
- value = selected.get('value', selected.text)\
- if selected else ''
- _add(name, value)
- elif tag == 'button':
- # Возможен такой вариант:
- # <button><img src="path/to/image"></button>
- # Как его обрабатывать я не знаю.
- _add(name, element.get('value', element.text))
- return data
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement