Страницы

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

понедельник, 30 марта 2020 г.

Аналог innerHTML для lxml

#html #python #lxml


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


Ответы

Ответ 1



Встроенного метода вроде бы нет, но нетрудно написать свой. Проблема в том, что простой текст в 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'

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

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