В процессе автоматизации действий с помощью Selenium возникла потребность получить значение стиля, заданного в атрибуте style DOM элемента. Самое простое решение воспользоваться функцией: element.value_of_css_property. Что делать, если потребуется преобразовать строку в словарь где-то еще, как это можно красиво сделать?
Постановка задачи
Есть строка вида:
"display: none; z-index: 9999;"
Требуется ее преобразовать в словарь:
{'display': 'none', 'z-index': '9999'}
Алгоритм решения
- Разбиваем на элементы
- Каждый элемент разбиваем на свойство и значение
- Сохраняем свойство и значение в словарь
Способ 1. Создание функции
def strToCssValues( sStyleValue ): pResult = {} for sPart in sStyleValue.split( ";" ): sPart = sPart.strip() if not sPart: continue; sProperty, sValue = sPart.split( ":" ) pResult[ sProperty.strip() ] = sValue.strip() return pResult
Способ 2. Использование генераторного выражения
Генераторные выражения записываются в виде:
( выражение for j in итерируемый_объект [ if условие ] )
Будет представлено последовательное преобразование к словарю следующей строки:
sStyle = "display: none; z-index: 9999;"
Шаг 1. Разбиваем на элементы
sStyle = "display: none; z-index: 9999;" pResult = [ sPart for sPart in sStyle.split( ";" ) if sPart ] print( pResult )
Шаг 2. Каждый элемент разбиваем на свойство и значение
sStyle = "display: none; z-index: 9999;" pResult = [ ( sProperty, sValue ) for sProperty, sValue in ( sPart.split( ":" ) for sPart in sStyle.split( ";" ) if sPart ) ] print( pResult )
Шаг 3. Сохраняем свойство и значение в словарь
sStyle = "display: none; z-index: 9999;" pResult = dict( ( sProperty.strip(), sValue.strip() ) for sProperty, sValue in ( sPart.split( ":" ) for sPart in sStyle.split( ";" ) if sPart ) ) print( pResult )
Полученный в данном способе код труднее читать, так как предполагает знакомство с генераторами, генераторными выражениями, возвратом из функции нескольких значений и кортежами.