簡體   English   中英

如何在lxml.html中刪除無關緊要的空格?

[英]How to remove insignificant whitespace in 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辯論,拜托?

除了XHTML自包含標記之外,RegEx匹配開放標記

編輯2:

如果從上下文中不清楚,我對HTML感興趣,而不是XHTML / XML。 空格確實在HTML中有一些重要的重要規則,但這些規則是在渲染器中實現的,而不是解析器。 我理解這一點,正如我最初的帖子所證明的那樣。 我的問題是,是否有人在一個在DOM級別而不是在渲染級別運行的庫中實現了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

哪個回報:

<html><body><p> Hello World </p></body></html>

我認為它會做你想要的,但正如你所看到的,保留了一些不相關的空間。

好。 你想檢測一些空格,並遠離那些空格。

您可以使用reg-exp來完成。

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

它會將所有相鄰的空格(當多於一個時)替換為一個且只有一個空格

'<p> Hello World </p>'

這是我的結果。

我認為它足夠接近你的期望,而且一個單獨的空白總是比可讀性更好。

使用更長的正則表達式,您應該設法消除HTML標記旁邊的空格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM