docs: def _parseSimpleSelector(self, src):
          """simple_selector
          : [ namespace_selector ]? element_name? [ HASH | class | attrib | pseudo ]* S*
          ;
          """
          ctxsrc = src.lstrip()
          nsPrefix, src = self._getMatchResult(self.re_namespace_selector, src)
          name, src = self._getMatchResult(self.re_element_name, src)
          if name:
              pass # already *successfully* assigned
          elif src[:1] in self.SelectorQualifiers:
              name = '*'
          else:
              raise self.ParseError('Selector name or qualifier expected', src, ctxsrc)
  
          name = self.cssBuilder.resolveNamespacePrefix(nsPrefix, name)
          selector = self.cssBuilder.selector(name)
          while src and src[:1] in self.SelectorQualifiers:
              hash_, src = self._getMatchResult(self.re_hash, src)
              if hash_ is not None:
                  selector.addHashId(hash_)
                  continue
  
              class_, src = self._getMatchResult(self.re_class, src)
              if class_ is not None:
                  selector.addClass(class_)
                  continue
  
              if src.startswith('['):
                  src, selector = self._parseSelectorAttribute(src, selector)
              elif src.startswith(':'):
                  src, selector = self._parseSelectorPseudo(src, selector)
              else:
                  break
  
          return src.lstrip(), selector