我很惊讶lxml.html在默认情况下在解析HTML时留下微不足道的空格。我也很惊讶我找不到任何明显的方法来使其不这样做。

Python 2.7.3 (default, Apr 10 2013, 06:20:15)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import lxml.etree
>>> parser = lxml.etree.HTMLParser(remove_blank_text=True)
>>> html = lxml.etree.HTML("<p>      Hello     World     </p>", parser=parser)
>>> print lxml.etree.tostring(html)
<html><body><p>      Hello     World     </p></body></html>

我希望结果将是这样的:
>>> print lxml.etree.tostring(html)
<html><body><p>Hello World</p></body></html>

BeautifulSoup4使用html5lib解析器执行相同的操作:
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<p>      Hello     World     </p>", "html5lib")
>>> soup.p
<p>      Hello     World     </p>

经过研究,我发现HTML5解析规范未指定删除连续的空格;而是在渲染时完成。因此,我知道从技术上讲,这些库都不负责执行相同的行为,但是它似乎很有用,令我感到惊讶的是它们都没有。

有人可以证明我错了吗?

编辑:

我知道如何使用正则表达式删除空格-这不是我的问题。 (我也知道如何在SO中搜索有关正则表达式的问题。)

我的问题与无关紧要的空白有关,空白的重要性由呈现HTML的标准定义。我怀疑1线正则表达式能否正确实现此标准。而且,我们甚至不必再研究正则表达式与CFG的争论了吗?

RegEx match open tags except XHTML self-contained tags

编辑2:

如果上下文不清楚,我对HTML感兴趣,而不对XHTML/XML感兴趣。空白在HTML中确实具有一些重要的重要规则,但是这些规则是在呈现器中实现的,而不是在解析器中实现的。我了解到这一点,正如我在最初的帖子中所证明的那样。我的问题是,是否有人在以DOM级别而非渲染级别运行的库中实现了HTML渲染器的空白逻辑?

最佳答案

我碰到了这个library

可以通过pip安装:

pip install htmlmin

它的用法如下:
from htmlmin import minify
html=u"<html><body><p>      Hello     World     </p></body></html>"
minified_html = minify(html)
print minified_html

哪个返回:
<html><body><p> Hello World </p></body></html>

我以为它可以满足您的需求,但是正如您所看到的,保留了一些无关的空间。

关于python - 如何删除lxml.html中无关紧要的空格?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18502410/

10-12 16:48