Аналог innerHTML для lxml

177
06 октября 2018, 09:20

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

Answer 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(
    '<div>Тек&lt;br&gt;ст1<h2>Тек&lt;br&gt;ст2</h2>Текст3<br/>Текст4</div>'
)
>>> lxml.html.tostring(node, encoding='unicode')
'<div>Тек&lt;br&gt;ст1<h2>Тек&lt;br&gt;ст2</h2>Текст3<br>Текст4</div>'
>>> inner_html(node)
'Тек&lt;br&gt;ст1<h2>Тек&lt;br&gt;ст2</h2>Текст3<br>Текст4'
READ ALSO
Выделить элементы в нужном порядке

Выделить элементы в нужном порядке

Как можно с использованием nth-of-type или nth-child выделить элементы в таком порядке:

168
Как сделать градиент элементу &lt;cricle/&gt; в &lt;svg&gt;

Как сделать градиент элементу <cricle/> в <svg>

Вопрос мой состоит в том, что нужно чтобы оранжевая полоса стала как на картинке

174
Хочу выставить текст на центр

Хочу выставить текст на центр

Хочу,чтобы было как на 1-ой картинке:

160