Это хорошие ответы, которые отвечают на вопрос ОП, особенно если вопрос ограничен HTML. Но документы по своей сути беспорядочные, и глубину вложенности элементов обычно невозможно предсказать.
Для имитации getTextContent () в DOM вам придется использовать (очень) простой рекурсивный механизм.
Чтобы получить только голый текст:
def get_deep_text( element ):
text = element.text or ''
for subelement in element:
text += get_deep_text( subelement )
text += element.tail or ''
return text
print( get_deep_text( element_of_interest ))
Чтобы получить все подробности о границах между необработанным текстом:
root_el_of_interest.element_count = 0
def get_deep_text_w_boundaries( element, depth = 0 ):
root_el_of_interest.element_count += 1
element_no = root_el_of_interest.element_count
indent = depth * ' '
text1 = '%s(el %d - attribs: %s)\n' % ( indent, element_no, element.attrib, )
text1 += '%s(el %d - text: |%s|)' % ( indent, element_no, element.text or '', )
print( text1 )
for subelement in element:
get_deep_text_w_boundaries( subelement, depth + 1 )
text2 = '%s(el %d - tail: |%s|)' % ( indent, element_no, element.tail or '', )
print( text2 )
get_deep_text_w_boundaries( root_el_of_interest )
Пример вывода из одного пункта в документации LibreOffice Writer (файл .fodt):
(el 1 - attribs: {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'Standard'})
(el 1 - text: |Ci-après individuellement la "|)
(el 2 - attribs: {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'T5'})
(el 2 - text: |Partie|)
(el 2 - tail: |" et ensemble les "|)
(el 3 - attribs: {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'T5'})
(el 3 - text: |Parties|)
(el 3 - tail: |", |)
(el 1 - tail: |
|)
Одним из моментов, связанных с беспорядком, является то, что не существует жесткого и быстрого правила о том, когда стиль текста указывает границу слова, а когда нет: верхний индекс, следующий за словом (без пробелов), означает отдельное слово во всех случаях. случаи, которые я могу себе представить. OTOH иногда вы можете найти, например, документ, в котором первая буква либо выделена жирным шрифтом по какой-либо причине, либо, возможно, использует другой стиль для первой буквы, чтобы представить ее в верхнем регистре, а не просто использовать обычный символ UC.
И, конечно, чем менее «англоцентрична» эта дискуссия, тем больше тонкостей и сложностей!