Python 如何删除lxml.html中不重要的空白?

Python 如何删除lxml.html中不重要的空白?,python,html-parsing,lxml.html,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 >>> parse

我很惊讶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>
Python 2.7.3(默认,2013年4月10日06:20:15)
[GCC 4.6.3]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入lxml.etree
>>>parser=lxml.etree.HTMLParser(remove\u blank\u text=True)
>>>html=lxml.etree.html(“helloworld

”,parser=parser) >>>打印lxml.etree.tostring(html) 你好,世界

我预计结果会是:

>>> print lxml.etree.tostring(html)
<html><body><p>Hello World</p></body></html>
打印lxml.etree.tostring(html) 你好,世界

BeautifulSoup4对html5lib解析器也做了同样的事情:

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<p>      Hello     World     </p>", "html5lib")
>>> soup.p
<p>      Hello     World     </p>
>>来自bs4导入组
>>>soup=BeautifulSoup(“你好,世界”,“html5lib”)
>>>汤
你好,世界

在做了一些研究之后,我发现HTML5解析规范没有指定删除连续的空白;这是在渲染时完成的。所以我明白,从技术上讲,这些库中的任何一个都没有责任执行相同的行为,但它似乎足够有用,我很惊讶它们中没有一个拥有它

有人能证明我错了吗

编辑:

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

我的问题与无关紧要的空白有关,其中的重要性由呈现HTML的标准定义。我怀疑单行正则表达式能否正确地实现这一标准。让我们不要再讨论regex和CFG的争论了,好吗

编辑2:


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

Ok。您希望检测到一些空白,并消除多余的空白

你可以用reg-exp来做

from re import sub
sub(r"(\s)+",' ',yourstring)
它将用一个且仅一个空格替换所有相邻的空格(当有多个空格时)

'<p> Hello World </p>'
“你好,世界

这是我的成绩

我想它已经足够接近您的期望了,一个单独的空格在可读性方面总是比没有好

使用稍长一点的正则表达式,您应该设法消除HTML标记旁边的空白。

我遇到了这个问题

可与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
从htmlmin导入缩小
html=u“你好,世界

” minified_html=minify(html) 打印缩小的html
返回:

<html><body><p> Hello World </p></body></html>
你好,世界


我原以为它会满足您的要求,但正如您所见,保留了一些不相关的空间。

您没有错。规范没有要求删除whilespace,因为这是一个呈现/实现细节;因为这真的不是问题,解决方案会减慢解析速度;这可能就是为什么它没有作为一项功能包括在内的原因。@BurhanKhalid我绝对不希望它在默认情况下被启用。这也会导致不兼容的解析。我也不会称之为“实施细节”。空白的处理是渲染标准中非常重要的一部分。如果这是一个实现细节,那么不同的浏览器会呈现不同的网站。谢谢!这绝对是接近我的想法,但它真的是马车<代码>测试

测试

缩小为
测试测试
!真奇怪。这里它没有,看:>>>>从htmlmin导入minify>>>html=u“测试

测试

”>>minified_html=minify(html)>>>打印minified_html测试

测试

您正在使用哪些版本的python和pip?很抱歉,在堆栈溢出时无法使用换行符格式化回复。你能理解我最后的评论吗?我只是想告诉你,我得到了
测试

测试

打印你提到的示例的缩小版本。啊,我的错误。我尝试了使用Node.js库而不是您所指的Python库的not-Implementation。Python库确实有效,谢谢!