私は次の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>"))
しかし、それはcontent_nav
divの直後ではなく内部に新しいdiv
を追加しません。
<div id="content_nav">
something goes here
<div style="clear:both"></div>
</div>
content_nav
divの途中にdiv
を追加し、p
内にそのようなcontents
を追加する方法はありますか?
ありがとう
contentnav
に追加する代わりに、特定のインデックスで親(contentdiv
)とinsert
新しいdiv
に移動します。そのインデックスを見つけるには、contentdiv.index(contentnav)
を使用します。これにより、contentnav
内のcontentdiv
のインデックスが得られます。これに1つ追加すると、目的のインデックスが得られます。
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>
兄弟の追加と追加にはaddprevious
とaddnext
を使用します。
Etree要素には、addprevious
とaddnext
の2つのメソッドがあります。
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>
質問に対処する汎用関数"別の要素の後に要素を挿入する"は、受け入れられた回答の単なる再定式化であっても、役立つ可能性があると思います。
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)