【问题标题】:Append element after another element using lxmlpython lxml在另一个元素之后追加元素
【发布时间】:2011-11-20 10:59:25
【问题描述】:

我有以下 HTML 标记

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

为了解决一些 CSS 问题,我想像这样在 content_nav div 之后附加一个 div 标签 &lt;div style="clear:both"&gt;&lt;/div&gt;

<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 附加在content_nav div 之后,而是在内部。

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

有什么办法可以在content_nav div 中间添加一个div 和一些p,就像在contents 里面一样?

谢谢

【问题讨论】:

标签: python html append lxml


【解决方案1】:

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

【讨论】:

  • 在这种情况下应该是 ET.HTML
【解决方案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)

【讨论】:

  • 你所做的只是重新实现element.appendnext()
  • @Shrewmouse 我猜你的意思是element.addnext()。我不知道它是什么时候添加到 API 中的,但现在它绝对是最好的解决方案。
【解决方案3】:

不要附加到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>

【讨论】:

  • 是的,我问了这个问题后也做了同样的事情。 :)
猜你喜欢
  • 2011-01-15
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2014-08-15
  • 2012-10-29
相关资源
最近更新 更多