в Python добавить элемент библиотека lxml за другой элемент
у меня есть следующая разметка HTML
<div id="contents">
<div id="content_nav">
something goes here
</div>
<p>
some contents
</p>
</div>
чтобы исправить некоторые проблемы CSS, я хочу добавить тег div <div style="clear:both"></div>
после content_nav
div вот так
<div id="contents">
<div id="content_nav">
something goes here
</div>
<div style="clear:both"></div>
<p>
some contents
</p>
</div>
я делаю это так:
import lxml.etree
tree = lxml.etree.fromString(inputString, parser=lxml.etree.HTMLParser())
contentnav = tree.find(".//div[@id='content_nav']")
contentnav.append(lxml.etree.XML("<div style='clear: both'></div>"))
но это не добавляет новый div
сразу после content_nav
div, но внутри.
<div id="content_nav">
something goes here
<div style="clear:both"></div>
</div>
есть ли способ, чтобы добавить div
в середине content_nav
div и некоторые p
внутри contents
?
спасибо
3 ответов
вместо добавления к contentnav
, подойдите к родителю (contentdiv
) и insert
новая div
по определенному индексу. Чтобы найти этот индекс, используйте contentdiv.index(contentnav)
, что дает индекс contentnav
внутри contentdiv
. Добавление одного к этому дает желаемый индекс.
import lxml.etree as ET
content='''\
<div id="contents">
<div id="content_nav">
something goes here
</div>
<p>
some contents
</p>
</div>
'''
tree = ET.fromstring(content, parser=ET.HTMLParser())
contentnav = tree.find(".//div[@id='content_nav']")
contentdiv = contentnav.getparent()
contentdiv.insert(contentdiv.index(contentnav)+1,
ET.XML("<div style='clear: both'></div>"))
print(ET.tostring(tree))
доходность
<html><body><div id="contents">
<div id="content_nav">
something goes here
</div>
<div style="clear: both"/><p>
some contents
</p>
</div></body></html>
Я считаю, что общая функция, обращающаяся к вопросу "вставить элемент после еще один элемент"!--6--> может быть полезно, даже если это просто переформулировка принято отвечать:
def insert_after(element, new_element):
parent = element.getparent()
parent.insert(parent.index(element)+1, new_element)
что позволяет вставить new_element
существующей element
С
insert_after(element, new_element)
использовать addprevious
и addnext
для подготовки и добавления братьев и сестер.
элемент etree имеет два метода: addprevious
и addnext
делаем именно то, что вы хотите.
import lxml.etree as ET
content='''\
<div id="contents">
<div id="content_nav">
something goes here
</div>
<p>
some contents
</p>
</div>
'''
tree = ET.fromstring(content, parser=ET.HTMLParser())
contentnav = tree.find(".//div[@id='content_nav']")
contentnav.addnext(ET.XML("<div style='clear: both'></div>"))
print(ET.tostring(tree))
выход:
<html><body><div id="contents">
<div id="content_nav">
something goes here
</div><div style="clear: both"/>
<p>
some contents
</p>
</div>
</body></html>