python - 使用lxml删除中文HTML文件中的多余空格

标签 python html lxml

我有一堆格式不正确的中文 html 文件。它们包含不必要的空格和换行符,这些空格和换行符将在浏览器中显示为额外空格。我已经使用 lxml 编写了一个脚本来修改 html 文件。它在简单标签上工作得很好,但我被嵌套标签困住了。例如:

<p>祝你<span>19</span>岁
    生日快乐。</p>

浏览器将显示为:

祝你19岁 生日快乐。

注意多余的空间。这就是需要删除的内容。结果 html 应该是这样的:

<p>祝你<span>19</span>岁生日快乐。</p>

我该怎么做?

请注意,嵌套(如 span 标签)可以是任意的,但我不需要考虑嵌套元素中的内容,它们应该按原样保留。只有外部元素中的文本需要格式化。

这就是我所拥有的:

# -*- coding: utf-8 -*-

import lxml.html
import re

s1 = u"""<p>祝你19岁
    生日快乐。</p>"""
p1 = lxml.html.fragment_fromstring(s1)
print p1.text         # I get the whole line.
p1.text = re.sub("\s+", "", p1.text)
print p1.tostring()   # spaces are removed.

s2 = u"""<p>祝你<span>19</span>岁
    生日快乐。</p>"""
p2 = lxml.html.fragment_fromstring(s2)
print p2.text     # I get "祝你"
print p2.tail     # I get None
i = p2.itertext()
print i.next()   # I get "祝你"
print i.next()   # I get "19" from <span>
print i.next()   # I get the tailed text, but how do I assemble them back?
print p2.text_content()  # The whole text, but how do I put <span> back?

最佳答案

>>> root = etree.fromstring('<p>祝你<span>19</span>岁\n生日快乐。</p>')
>>> etree.tostring(root)
b'<p>&#31069;&#20320;<span>19</span>&#23681;\n&#29983;&#26085;&#24555;&#20048;&#12290;</p>'

>>> for e in root.xpath('/p/*'):
...   if e.tail:
...     e.tail = e.tail.replace('\n', '')
...

>>> etree.tostring(root)
b'<p>&#31069;&#20320;<span>19</span>&#23681;&#29983;&#26085;&#24555;&#20048;&#12290;</p>'

关于python - 使用lxml删除中文HTML文件中的多余空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9767719/

相关文章:

Python:如何在 2020 年提供单个可执行文件而不显示代码

python - 如何使用 raw_input 获取汉字

javascript - 从周围的 HTML 调用 SVG 内部的 JavaScript 函数

python - BeautifulSoup:从叶到根搜索首先获取 "deepest"元素?

python ,XPath : Find all links to images

java - 正则表达式的多重匹配?

python - 在 Python 中打印列表时出现脏打印

javascript - 如何在表单本身之外提交表单

html - 伪类 :first-child not working

python - 将 XML 目录与 Python 的 lxml 一起使用?