2012-08-04 339 views
1

我需要一種高效且(合理)可靠的方法從文檔中去除HTML標籤。它需要能夠處理一些相當不利的情況:剝離HTML標籤而不使用HtmlAgilityPack

  • 事先並不知道文檔是否包含HTML。
  • 更可能的是,任何HTML格式都會很差。
  • 單個文檔可能非常大,也許數百兆字節。
  • 由於任何奇怪的原因,非HTML內容可能仍然會被尖括號散佈,所以沿着<.+/?>的行的樸素正則表達式是不合適的。 (無論如何,剝離XML是不太理想的。)

我目前使用HTML Agility Pack,它只是不切割芥末。性能比我想要的更差,它並不總是能夠儘可能優雅地處理真正糟糕的格式化,最近我遇到了一些堆棧溢出的問題,這些問題在一些更令人生氣的大文件上出現。

我懷疑所有這些問題都源於它試圖實際解析數據,這使得它不適合我的需求。我不想要一個語法樹;我只想(大部分)標籤消失。

使用正則表達式似乎是明顯的候選。但後來我記得this famous answer,這讓我擔心這不是一個好主意。但是,謾罵的觀點非常關注解析,而不一定是愚蠢的標籤剝離。那麼正則表達式可以達到這個目的嗎?

假設這不是一個可怕的想法,那麼對於可以很好地工作的正則表達式的建議是非常受歡迎的。

+1

我們都讀過這樣的傑作......我說的是你引用的答案:) ......無論如何我們也知道使用正則表達式來處理html數據時通常很難說。我不清楚你的意思是什麼意思,「我只是希望(大部分)標籤消失。你是指符合特定標準的特定標籤及其所有內容? – 2012-08-04 15:34:10

+0

因爲由於正則表達式模式無法描述層次結構,因此您可能使用它們只是爲了實現你自己的解析策略,用正則表達式提取部分文本,並委託責任人保留或從最終結果中刪除它。我不知道性能......也許不好。 – 2012-08-04 15:41:00

+0

@DiegoDeVita我的意思是我需要從流中去除HTML標籤,並保留其他內容,我說「大部分」是因爲100%的可靠性不是必須的,如果奇怪的瀏覽器特定標籤使它通過,那很好,因爲該數據被傳遞到旨在接受嘈雜數據的軟件 – 2012-08-04 18:06:00

回答

1

這個正則表達式找到所有標籤避免在括號內的引號中的尖括號。

<[a-zA-Z0-9/_-]+?((".*?")|([^<"']+?)|('.*?'))*?> 

這是無法檢測,引號裏的轉義引號(但我認爲這是在HTML不必要的)

擁有所有合法的標籤列表,並在正則表達式的第一部分替換它,像<(tag1|tag2|...)可以帶來更精確的解決方案,我怕一個確切的解決方案無法開始與你的尖括號假設可以發現,認爲例如爲類似<a href="test.html"> b<a </a> ...

編輯

更新了正則表達式(表現比後者好得多),而且如果你需要去除代碼,我建議在第一次啓動之前進行一點清理,就像用<script.+?</script>什麼也沒有。

+0

我結束了很多事情。實際上有一系列正在運行的正則表達式:一個用於處理標籤之間的所有內容都需要執行的事情 - 腳本,正如您所建議的,還包括標頭,樣式和其他一些內容。一對夫婦處理需要用空白替換的特定標籤。還有一個像上面這樣的通用處理器,可以處理其他所有事情,儘管它最終會變得相當複雜一些,以便使其誤報率降到最低。 – 2012-08-23 00:21:27

+0

好!然後發佈你的正則表達式! (請:)) – Gabber 2012-08-23 06:48:23

+1

以下是一般版本:'「」] *「」 ^>'] *'| [ - \ w:;,\ ./#=&_ \?@ \(\)\ +%!\ *] *))?)* \ s * /?>'通過替換前導的'\ w'來創建特定的代碼,並且如果不應該替換close代碼,則省略前面的'/?'。 – 2012-08-23 13:48:47

1

我只是在這個盒子外面思考,但你可能會考慮利用諸如Microsoft Word或OpenOffice之類的東西。

我使用Word automation將HTML翻譯爲DOC,RTF或TXT。 Word原生的HTML to TXT轉換將爲您提供您想要的內容,剝離所有HTML標籤並將其轉換爲文本格式。當然,如果你正在處理大量微型HTML文件,那麼這將毫無用處,因爲在這一切中都有一些開銷。但是,如果你正在處理大量文件,這可能不是一個不錯的選擇,因爲我確信Word對這些轉換進行了大量優化。您可以通過在Word中手動打開一個最大的HTML文件並將其保存爲TXT文件並查看Word保存多長時間來測試此理論。

雖然我還沒有嘗試過,但我敢打賭可以通過編程方式與OpenOffice交互來完成類似的事情。