python - 如何删除 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
>>> 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/

相关文章:

python - 如何在Python中读取unicode文件名?

java - java中的正则表达式

python-2.7 - 如何通过从下拉选项中选择一个值而不使用 Selenium 来获取数据

python - 比较路径和请求的字符串结果

python - 使用lxml获取父标签id

python - 在 django 中与 elasticsearch 交互

尝试将两个适当维度的 numpy 矩阵相乘时 Python 返回错误

python - 使用 Python-social-auth 未在管道中设置社交用户

Python漂亮的汤表单输入解析

php - 如何删除 <ul> 元素内标记对之间的所有空格