给元素添加兄弟节点
有以下HTML标记
<div id="contents">
<div id="content_nav">
something goes here
</div>
<p>
some contents
</p>
</div>
为了解决一些CSS问题,我想在div后面附加一个div标记<div style="clear:both"></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后面附加新的div,而是在div内部。
<div id="content_nav">
something goes here
<div style="clear:both"></div>
</div>
有没有办法在#content_nav的div的后面添加一个div?
解决办法一
使用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>
解决办法二
与其附加到contentnav,不如向上附加到父级(contentdiv)和insert在特定索引处的新div。要找到该索引,请使用contentdiv.index(contentnav),它给出contentdiv中contentnav的索引。添加一个可以得到所需的索引。
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>
解决办法三
在另一个元素后面插入一个元素:
def insert_after(element, new_element):
parent = element.getparent()
parent.insert(parent.index(element)+1, new_element)
它允许在现有的element之后插入一个new_element,使用:
insert_after(element, new_element)