Страницы

Поиск по вопросам

пятница, 7 июня 2019 г.

Аналог innerHTML для lxml

Как получить всё содержимое внутри HTML-тега в lxml, но без самого тега?


Ответ

Встроенного метода вроде бы нет, но нетрудно написать свой.
Проблема в том, что простой текст в lxml не является самостоятельным элементом (в отличие от Text Node в браузерах), поэтому нужно не забыть добавить text в начале.
from html import escape # Доступно с Python 3.2 import lxml.html
def inner_html(elem): # Текст в самом начале внутри тега # (не забываем про экранирование!) result = [escape(elem.text or '')]
# Все элементы-потомки for child in elem.iterchildren(): result.append(lxml.html.tostring(child, encoding='unicode')) # Текст в конце тега принадлежит последнему элементу-потомку (tail) # и добавится автоматически
# Собираем результат в одну строку return ''.join(result)

# В примере подставим <br> чтобы проверить экранирование >>> node = lxml.html.fragment_fromstring( '

Тек<br>ст1

Тек<br>ст2

Текст3
Текст4
' )
>>> lxml.html.tostring(node, encoding='unicode') '
Тек<br>ст1

Тек<br>ст2

Текст3
Текст4
'
>>> inner_html(node) 'Тек<br>ст1

Тек<br>ст2

Текст3
Текст4'

Комментариев нет:

Отправить комментарий