2011-09-19 57 views
11

我有以下的HTML標記蟒蛇LXML其它元素之後追加元素

<div id="contents"> 
    <div id="content_nav"> 
     something goes here 
    </div> 
    <p> 
     some contents 
    </p> 
</div> 

要解決一些CSS問題,我想content_nav DIV這樣

<div id="contents"> 
    <div id="content_nav"> 
     something goes here 
    </div> 

    <div style="clear:both"></div> 

    <p> 
     some contents 
    </p> 
</div> 

後div標籤<div style="clear:both"></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>")) 

但是,這並不是應用程序在content_nav div之後立即結束新的div

<div id="content_nav"> 
    something goes here 
    <div style="clear:both"></div> 
</div> 

有沒有辦法在content_nav div的中間,一些p像這裏面contents添加div

感謝

+0

CSS唯一的解決辦法:http://www.quirksmode.org/css/clearing.html –

回答

24

而不是追加到contentnav,去到父(contentdiv)和insertdiv在一個特定的指數。要找到該索引,請使用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> 
+0

是啊,我也做了同樣的事情問這個問題了。 :) –

2

我相信,一個通用的功能解決問題「其它元素之後插入一個元素」可能是有用的,哪怕它只是一個公認的答案的改寫如下:

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) 
+0

你所做的一切都是重新實現'element.appendnext()'。 – shrewmouse

+0

@Shrewmouse我想你的意思是'element.addnext()'。我不知道它何時添加到API中,但現在它確實是最好的解決方案。 – mmj

1

使用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>