python - python Xpath:如何删除空标签但保留同级尾随文本?
问题描述
<div>
1
<br/>
5
<p> </p>
2
</div>
假设我必须删除空标签。在此示例中,空标签是<p> </p>
. 我创建了这个函数来为我完成这项工作。但它也会2
在<p>
标记后删除。那我该怎么办?
def reformat_article(text):
tree = etree.fromstring(text, parser=etree.HTMLParser(encoding='utf-8'))
# etree.strip_attributes(tree, 'style')
etree.strip_tags(tree, 'span', 'font')
for script in tree.xpath('//script'):
script.getparent().remove(script)
for empty in tree.xpath('//*[text() and not(*)]'):
if re.match(r'^\s+$', ''.join(empty.xpath('./text()'))):
empty.getparent().remove(empty)
for empty in tree.xpath('//*[not(self::br) and not(*) and not(normalize-space()) and not(self::text())]'):
empty.getparent().remove(empty)
for align in tree.xpath('//*[text()]'):
s_s = re.compile(r'\s{20,}')
for line in align.xpath('./text()'):
if s_s.search(line):
align.attrib['align'] = 'right'
text = etree.tostring(tree, encoding='utf-8').decode()
return text
解决方案
要删除不带尾字符串的元素,请使用以下函数:
def remove_element(el):
parent = el.getparent()
tail = el.tail
if tail is not None and len(tail.strip()) > 0:
prev = el.getprevious()
if prev is not None:
prev.tail = (prev.tail or '') + el.tail
else:
parent.text = (parent.text or '') + el.tail
parent.remove(el)
我通过以下方式对其进行了测试:
from lxml import etree as et
parser = et.XMLParser(remove_blank_text=True)
txt = '<div>1<br/>5<p> </p>2</div>'
tree = et.XML(txt, parser)
for emp in tree.xpath('//*[text() and not(*)]'):
remove_element(emp)
print(et.tostring(tree, method='xml', encoding='unicode',
pretty_print=True).strip())
我得到的结果是:
<div>1<br/>52</div>
推荐阅读
- android - FusedLocationProviderClient :空对象引用上的 Location.getLatitude()
- vb.net - 如何将 GIF 动画播放到最后一帧,然后停止动画?
- javascript - 如何在 Typescript 中制作优雅的状态转换图?
- youtube-iframe-api - 我们可以使用 youtube_player_iframe 将应用程序与内部的 Youtube 视频货币化吗
- fivetran - 取消对该表的同步后,是否可以使用 Fivetran 目标表进行写入?
- javascript - Ajax 调用后未触发按钮事件
- nginx - 两层 NGINX 反向代理,第二层带有 ssl_client_verify
- c++ - 我可以在类外初始化一个“constexpr static”成员吗?
- c# - Xamarin 中具有绑定和命令的按钮列表
- ios - iPad 默认列表视图