使用 lxml 在另一个元素之后追加元素

新手上路,请多包涵

我有以下 HTML 标记

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

为了解决一些 CSS 问题,我想在 content_nav 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>"))

但这并没有在 content_nav div 之后附加新的 div 而是在里面。

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

Is there any way to add a div in the middle of content_nav div and some p like that inside contents ?

谢谢

原文由 Tu Hoang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 396
2 个回答

Instead of appending to contentnav , go up to the parent ( contentdiv ) and insert the new div at a particular index.要找到该索引,请使用 contentdiv.index(contentnav) ,它给出 contentnavcontentdiv 中的索引。将其加一即可得到所需的索引。

 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>

原文由 unutbu 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 addpreviousaddnext 用于前置和附加兄弟姐妹。

lxml.etree _Element 有两种方法: 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>

原文由 shrewmouse 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题