删除某个子节点之后的子节点

Delete child nodes after a certain child node

我想删除 <hr/> 元素(包括 <hr/>)下方元素内的所有节点(包括文本)。

例如,这个:

<td class="one">
    Some text
    <a href="page1.html"/>
    <br/>
    Some more text
    <br/>
    <a href="page2.html"/>
    <hr/>
    Bottom text
    <br/>
    <a href="page3.html"/>
</td>

应该变成:

<td class="one">
    Some text
    <a href="page1.html"/>
    <br/>
    Some more text
    <br/>
    <a href="page2.html"/>
</td>

我有这个 XPath 可以找到下面的所有元素 <hr/>:

./node()[ preceding-sibling::hr[not(following-sibling::hr)] ]

但是我不知道如何删除这些元素。 我试过这样做:

xp = './node()[ preceding-sibling::hr[not(following-sibling::hr)] ]'
els = self.xpath(xp, td_el)
for el in els:
    el.getparent().remove(el)

但它不适用于文本节点。

最好的方法是什么? 谢谢。

尝试使用以下代码删除节点:

from lxml import etree, html

source = """<td class="one">
    Some text
    <a href="page1.html"/>
    <br/>
    Some more text
    <br/>
    <a href="page2.html"/>
    <hr/>
    Bottom text
    <br/>
    <a href="page3.html"/>
</td>"""
html = html.fromstring(source)
parent = html.xpath('//td')[0]
redundant = html.xpath('//hr/preceding-sibling::*[1]/following-sibling::*')

for node in redundant:
    parent.remove(node)

print(etree.tostring(parent))

输出

<td class="one">
    Some text
    <a href="page1.html"/>
    <br/>
    Some more text
    <br/>
    <a href="page2.html"/>
</td>