我有以下HTML标记
<div id="contents">
<div id="content_nav">
something goes here
</div>
<p>
some contents
</p>
</div>
要解决一些CSS问题,我想在<div style="clear:both"></div>
div之后添加div标签content_nav
<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
div之后追加新的content_nav
但是在里面。
<div id="content_nav">
something goes here
<div style="clear:both"></div>
</div>
有没有办法在div
div的中间添加content_nav
,在p
内添加一些contents
?
由于
答案 0 :(得分:30)
不要追加到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>
答案 1 :(得分:5)
使用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>
答案 2 :(得分:2)
我认为解决问题“在另一个元素之后插入元素”的通用函数可能会有用,即使它只是对已接受答案的重新阐述:
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)