删除某个子节点之后的子节点
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>
我想删除 <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>