2011-03-29 93 views
2

我們通過一些外部轉換工具將DOCX轉換爲HTML。 爲表生成的HTML包含這樣的事情:刪除不必要的內部標籤

<td><div><span><b>Patienten</b></span></div></td> 

內TD的<div><span>標籤是完全多餘這裏。

預期的結果是

<td><b>Patienten</b></td> 

是有一些機會,消除他們使用BeautifulSoup一個明智的方法是什麼?

+0

http://stackoverflow.com/questions/1765848/remove-a-tag-using-beautifulsoup-but-keep-its-contents/1766002#1766002 – systempuntoout 2011-03-29 15:19:02

回答

1

好傑西Dhillon的答案的strip_tags功能,<div><span>標籤具有結構意義,不能被自動猜測爲「多餘」。

您的問題與編譯器中完成的AST(抽象語法樹)優化看起來非常相似。您可以嘗試定義一些規則並構建一個樹(您的文檔)並生成優化的輸出樹。規則可以是:

  • 跨度(內容) - >內容,如果span.attributes是空
  • DIV(內容) - >內容,如果div.attributes是空

。注意,可以使用XSLT完成XML方言中的樹轉換。只要準備好在你看到光線之前讓你的大腦翻轉過來!

+0

在這種特殊情況下,可以通過檢查子樹。 – 2011-03-29 14:27:00

0

你能重新解析樹是這樣的:

from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup("<td><div><span><b>Patienten</b></span></div></td>") 
td = soup.td 
b = soup.td.div.span.b 
td.insert(0,b) 
td.div.extract() 
print soup 
0

我喜歡approach suggested by @Daren Thomas,但要知道,消除這些「無用」的標籤可能嚴重影響文檔感謝的JavaScript渲染的外觀(不太可能)或CSS(更有可能,甚至可能),它依賴於生成的HTML來遵循特定的結構模式,即使它們是浪費的。

這使得工具作家的生活更容易。假設DOCX中的某個給定構造有兩種可能的變體。其中之一需要大量樣板,以便您可以附加一些特殊屬性(例如text-align或其他一些)。另一個沒有。只要總是生成樣板文件並寫出你的CSS或者你想到的事實,那會更容易。

0

如果只有美麗的湯是不夠的,你可以訴諸正則表達式。

import re 

ch = 'sunny day<td><div><span><b>Patienten</b></span></div></td>rainy week' 
# <td><b>Patienten</b></td> 

RE = '(<td>)<div><span>(<b>.*?</b>)</span></div>(</td>)' 

pat = re.compile(RE) 

print ch 
print pat.sub('\\1\\2\\3',ch) 

結果

sunny day<td><div><span><b>Patienten</b></span></div></td>rainy week 
sunny day<td><b>Patienten</b></td>rainy week 

簡單,easyn't呢?

可以進行初步檢查以確定替換是否必須完成。

1

我們這樣做的方式是使用lxml並確定每個元素的父母和孩子。如果父母和孩子之間沒有文本內容差異,那麼我們就有一套規則來保留某些孩子,同時拋棄父母。然後強制適當的塊元素在你的情況b是span,div和td的子元素,我們知道td標籤是相關的結構元素,所以我們擺脫了其他元素。這又需要測試每個嵌套元素的文本內容。