Как сказал llasram, любой текст, отсутствующий в атрибуте text
, будет находиться в атрибутах tail
дочерних узлов.
В качестве примера, вот самый простой способ извлечь всех фрагментов текста (первого и других) в узле:
html = '<div>text1<span>childtext1</span>text2<span>childtext2</span>text3</div>'
import lxml.html # ...or lxml.etree as appropriate
div = lxml.html.fromstring(html)
texts = [div.text] + [child.tail for child in div]
# Result: texts == ['text1', 'text2', 'text3']
# ...and you are guaranteed that div[x].tail == texts[x+1]
# (which can be useful if you need to access or modify the DOM)
Если вы предпочли бы пожертвовать этим отношением, чтобы не дать texts
потенциально содержать пустые строки, вы можете использовать это вместо:
texts = [div.text] + [child.tail for child in div if child.tail]
Я не проверял это с простым старым stdlib ElementTree, но он должен работать и с этим. (Что-то, что пришло мне в голову, как только я увидел решение Шейна Холлоуэя для lxml, специфичное для lxml), я просто предпочитаю LXML, потому что он получил лучшую поддержку идеосинкразий HTML, и я обычно уже установил его для lxml.html.clean