如何在lxml.html中删除无关紧要的空格?

时间:2013-08-29 04:40:41

标签: python html-parsing lxml.html

我很惊讶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的标准定义。我怀疑单线程正则表达式是否可以正确实现此标准。让我们再次深入研究正则表达式与CFG辩论,拜托?

RegEx match open tags except XHTML self-contained tags

编辑2:

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

2 个答案:

答案 0 :(得分:4)

我遇到了这个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>

我认为它会做你想要的,但正如你所看到的,保留了一些不相关的空间。

答案 1 :(得分:-3)

确定。你想检测一些空格,并远离那些空格。

您可以使用reg-exp。

from re import sub
sub(r"(\s)+",' ',yourstring)

它会将所有相邻的空格(当多于一个时)替换为一个且只有一个

'<p> Hello World </p>'

是我的结果。

我认为它足够接近你的期望,而且一个单独的空白总是比可读性更好。

使用更长的正则表达式,您应该设法远离HTML标记旁边的空格。