my_species = {}
current_class = None
for node in species.xpath('child::node()'):
    if isinstance(node, lxml.etree._ElementStringResult):
        text = node.strip(' \n\t:')
if text:
    current_class = my_species.setdefault(text, [])
elif isinstance(node, lxml.etree._Element):
    if current_class is not None:
        current_class.append(node.tag)
print(my_species)
Итерация как по тексту, так и по элементам в lxml etree