2013-12-10 98 views
1

我有一堆HTML頁面,我想將CSS格式的文本片段轉換爲標準HTML標記。 e.g <span class="bold">some text</span>將成爲<b>some text</b>用Python中的正則表達式替換嵌套字符串

我被堵在嵌套span片段:

<span class="italic"><span class="bold">XXXXXXXX</span></span> 
<span class="italic">some text<span class="bold">nested text<span class="underline">deep nested text</span></span></span> 

我想使用Python的正則表達式庫中的片段轉換。正則表達式搜索的最佳策略是什麼? - 取代上述輸入?

+1

爲什麼必須通過正則表達式來完成? – hwnd

+0

這只是個人喜好。我知道這可以通過recusive純字符串搜索來完成......但不知怎的,我發現正則表達式的解決方案更優雅...... – masroore

+2

最佳策略實際上是使用正則表達式以外的其他東西,而這些正則表達式對此非常不利。 [美麗的湯](http://www.crummy.com/software/BeautifulSoup/)是用Python解析HTML的最流行的解決方案。 –

回答

1

使用LXML和cssselect和一點的Python我的解決辦法:

#!/usr/bin/env python 

import cssselect # noqa 
from lxml.html import fromstring 


html = """ 
<span class="italic"><span class="bold">XXXXXXXX</span></span> 
<span class="italic">some text<span class="bold">nested text<span class="underline">deep nested text</span></span></span> 
""" 

class_to_style = { 
    "underline": "u", 
    "italic": "i", 
    "bold": "b", 
} 

output = [] 
doc = fromstring(html) 
spans = doc.cssselect("span") 
for span in spans: 
    if span.attrib.get("class"): 
     output.append("<{0}>{1}</{0}>".format(class_to_style[span.attrib["class"]], span.text or "")) 
print "".join(output) 

輸出:

<i></i><b>XXXXXXXX</b><i>some text</i><b>nested text</b><u>deep nested text</u> 

注:這是一個天真的解決方案,不會產生正確的輸出,你必須保持打開標籤的隊列,並在最後關閉它們。

+1

太棒了!直到現在我還沒有意識到cssselect !謝謝@James Mills! – masroore

+0

歡迎在我的工作中使用它很多:) http://pypi.python.org/pypi/spyda –

+0

糟糕!它不能按預期工作。輸出應該是:'' XXXXXXXX某些文字嵌套文字深層嵌套文字' – masroore