Mar*_*ase 5 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>
Run Code Online (Sandbox Code Playgroud)
我希望结果是这样的:
>>> print lxml.etree.tostring(html)
<html><body><p>Hello World</p></body></html>
Run Code Online (Sandbox Code Playgroud)
BeautifulSoup4 用 html5lib 解析器做同样的事情:
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<p> Hello World </p>", "html5lib")
>>> soup.p
<p> Hello World </p>
Run Code Online (Sandbox Code Playgroud)
经过一番研究,我发现HTML5解析规范并没有规定去除连续的空格;这是在渲染时完成的。所以我知道从技术上讲,这些库中的任何一个都没有责任执行相同的行为,但它似乎足够有用,以至于我很惊讶他们都没有。
有人能证明我错了吗?
编辑:
我知道如何使用正则表达式去除空格——这不是我的问题。(我也知道如何搜索有关正则表达式的问题。)
我的问题与无关紧要的空白有关,其中的重要性由呈现 HTML 的标准定义。我怀疑 1 行正则表达式能否正确实现此标准。我们甚至不要再深入研究正则表达式与 CFG 的争论,好吗?
编辑2:
如果上下文不清楚,我对 HTML 感兴趣,而不是 XHTML/XML。空格在 HTML 中确实有一些重要的重要规则,但是这些规则是在渲染器中实现的,而不是解析器。我明白这一点,正如我最初的帖子所证明的那样。我的问题是是否有人在一个在 DOM 级别而不是在渲染级别操作的库中实现了 HTML 渲染器的空白逻辑?
我偶然发现了这个图书馆。
可以用pip安装:
pip install htmlmin
Run Code Online (Sandbox Code Playgroud)
它的用法如下:
from htmlmin import minify
html=u"<html><body><p> Hello World </p></body></html>"
minified_html = minify(html)
print minified_html
Run Code Online (Sandbox Code Playgroud)
返回:
<html><body><p> Hello World </p></body></html>
Run Code Online (Sandbox Code Playgroud)
我认为它会满足您的要求,但正如您所看到的,保留了一些不相关的空间。
| 归档时间: |
|
| 查看次数: |
2407 次 |
| 最近记录: |