【Python】python lxml给元素添加兄弟节点

本文探讨了如何在HTML中为现有div元素添加一个后续的<div>元素,以解决CSS布局问题。通过实例展示了使用lxml.etree和ElementTree库的不同方法,包括直接附加、添加到父级以及利用addprevious和addnext函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给元素添加兄弟节点

有以下HTML标记

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

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

但这不会在div后面附加新的div,而是在div内部。

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

有没有办法在#content_nav的div的后面添加一个div?

解决办法一

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

解决办法二

与其附加到contentnav,不如向上附加到父级(contentdiv)和insert在特定索引处的新div。要找到该索引,请使用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>

解决办法三

在另一个元素后面插入一个元素:

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值