我們通過一些外部轉換工具將DOCX轉換爲HTML。 爲表生成的HTML包含這樣的事情:刪除不必要的內部標籤
<td><div><span><b>Patienten</b></span></div></td>
內TD的<div>
和<span>
標籤是完全多餘這裏。
預期的結果是
<td><b>Patienten</b></td>
是有一些機會,消除他們使用BeautifulSoup一個明智的方法是什麼?
我們通過一些外部轉換工具將DOCX轉換爲HTML。 爲表生成的HTML包含這樣的事情:刪除不必要的內部標籤
<td><div><span><b>Patienten</b></span></div></td>
內TD的<div>
和<span>
標籤是完全多餘這裏。
預期的結果是
<td><b>Patienten</b></td>
是有一些機會,消除他們使用BeautifulSoup一個明智的方法是什麼?
你可以使用的this question
好傑西Dhillon的答案的strip_tags
功能,<div>
和<span>
標籤具有結構意義,不能被自動猜測爲「多餘」。
您的問題與編譯器中完成的AST(抽象語法樹)優化看起來非常相似。您可以嘗試定義一些規則並構建一個樹(您的文檔)並生成優化的輸出樹。規則可以是:
。注意,可以使用XSLT完成XML方言中的樹轉換。只要準備好在你看到光線之前讓你的大腦翻轉過來!
在這種特殊情況下,可以通過檢查子樹。 – 2011-03-29 14:27:00
你能重新解析樹是這樣的:
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
我喜歡approach suggested by @Daren Thomas,但要知道,消除這些「無用」的標籤可能嚴重影響文檔感謝的JavaScript渲染的外觀(不太可能)或CSS(更有可能,甚至可能),它依賴於生成的HTML來遵循特定的結構模式,即使它們是浪費的。
這使得工具作家的生活更容易。假設DOCX中的某個給定構造有兩種可能的變體。其中之一需要大量樣板,以便您可以附加一些特殊屬性(例如text-align
或其他一些)。另一個沒有。只要總是生成樣板文件並寫出你的CSS或者你想到的事實,那會更容易。
如果只有美麗的湯是不夠的,你可以訴諸正則表達式。
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呢?
可以進行初步檢查以確定替換是否必須完成。
我們這樣做的方式是使用lxml並確定每個元素的父母和孩子。如果父母和孩子之間沒有文本內容差異,那麼我們就有一套規則來保留某些孩子,同時拋棄父母。然後強制適當的塊元素在你的情況b是span,div和td的子元素,我們知道td標籤是相關的結構元素,所以我們擺脫了其他元素。這又需要測試每個嵌套元素的文本內容。
http://stackoverflow.com/questions/1765848/remove-a-tag-using-beautifulsoup-but-keep-its-contents/1766002#1766002 – systempuntoout 2011-03-29 15:19:02