请教关于 lxml 中 remove 方法的问题

2015-02-24 16:10:17 +08:00
 gogogen

通过如下代码希望替换掉网页原文中的空标签节点

page = lxml.etree.HTML('<span lang="en-us"><p></p>223</span>')
for empty in page.xpath('//*[not(node())]'):
    empty.getparent().remove(empty)
print lxml.html.tostring(page)

结果输出为
<html><body><span lang="en-us"></span></body></html>

去掉了空节点外的字符,请问如何保留原文中的“223”并且实现替换?

3331 次点击
所在节点    Python
4 条回复
cute
2015-02-25 11:22:49 +08:00
`
from lxml import html
print html.fromstring('<span lang="en-us"><p></p>223</span>').text_content()

`
gogogen
2015-02-25 18:26:53 +08:00
@cute 感谢
不过我只是通过这个简单网页举例而已,我并不是只要取特定节点的内容,而是想去掉空节点之后,不会影响到节点之后的内容。
不知道应该如何解决?
cute
2015-02-26 10:13:34 +08:00
```
from lxml import html
doc = html.fromstring('<span lang="en-us">11<p></p>223</span>')
for elem in doc.xpath('//*[not(node())]'):
parent = elem.getparent()
if elem.tail:
if not parent.text:
parent.text = elem.tail
else:
parent.text = parent.text + elem.tail
parent.remove(elem)
print html.tostring(doc)
```
cute
2015-02-26 10:53:10 +08:00
重新发一个。

from lxml import html

doc = html.fromstring('<span lang="en-us">sss<p></p>223</span>')
func = lambda x, p: setattr(p, 'text', p.text + x.tail if p.text else x.tail)
map(
lambda x: x.tail and func(x, x.getparent()) or x.getparent().remove(x),
doc.xpath('//*[not(node())]')
)

print html.tostring(doc)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/172495

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX