python lxml追加另一个元素之后的元素

时间:2011-09-19 17:38:35

标签: python html append lxml

我有以下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

由于

3 个答案:

答案 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)

使用addpreviousaddnext预先添加和添加兄弟姐妹。

etree元素有两种方法:addpreviousaddnext,可以完全按照自己的意愿行事。

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)