brandizzi icon

Implementing get_css_class_dict()

brandizzi | PRO | 02/26/18 09:46:33 AM UTC | 0 ⭐ | 1353 👁️ | Never ⏰ | []
Python |

1.39 KB

|

None

|

0 👍

/

0 👎

def get_css_class_dict(node):
    """
    Given an xml.dom.minidom.Node, returns a map from every "class" attribute
    from it to a list of nodes with this class.
 
    For example, for the document below:
 
    >>> doc = xml.dom.minidom.parseString(
    ...     '''
    ...     <html>
    ...         <body>
    ...             <div class="a b"><span class="a"></span></div>
    ...         </body>
    ...     </html>
    ...     ''')
 
    ...we will get this:
 
    >>> d = get_css_class_dict(doc)
    >>> d['a']  # doctest: +ELLIPSIS
    [<DOM Element: div at ...>, <DOM Element: span at ...>]
    >>> d['b']  # doctest: +ELLIPSIS
    [<DOM Element: span at ...>]
    """
    css_class_dict = {}
 
    if node.attributes is not None and 'class' in node.attributes:
        css_classes = node.attributes['class'].value
 
        for css_class in css_classes.split():
            css_class_list = css_class_dict.get(css_class, [])
            css_class_list.append(node)
            css_class_dict[css_class] = css_class_list
 
    childNodes = getattr(node, 'childNodes', [])
 
    for cn in childNodes:
        ccd = get_css_class_dict(cn)
        for css_class, nodes_list in ccd.items():
            css_class_list = css_class_dict.get(css_class, [])
            css_class_list.extend(nodes_list)
            css_class_dict[css_class] = css_class_list  
 
    return css_class_dict

Comments