2010-10-02 49 views
2

我使用Python和Flask創建博客(和網站的其餘部分)。博客文章是用Markdown編寫的,並使用創造性地命名的Markdown in Python轉換爲HTML。 Markdown(用於未來編輯)和HTML(用於顯示)都存儲在數據庫中。如何獲得HTML或Markdown的前300個有效字符?

我希望能夠自動獲取文字的前300個字符(或500或200 - 我還沒有算出數字)在頁面上使用時,我不想顯示完整博客文章(如在頭版)。然而,問題是,這樣做的任何簡單的方式將可能會讓我與無效HTML或降價

HTML:

<p><em>Here</em> is <strong>formatted</strong> text.</p> 

如果我得到的這個前十個字符,它將會通過格式化爲而中途退出,而且我會以某種方式關閉<strong><p>標記。

降價:

*Here* is **formatted** text. 

同樣地,得到了前十個字符會離開我需要關閉**大膽。

有沒有什麼辦法可以做到這一點,而無需編寫HTML或Markdown解析器?或者,我只是將HTML轉換爲純文本而變得更好?

回答

2

如果總結只是純文本,那麼Adam的答案肯定是最好的 - 首先轉換爲純文本,然後截斷。

如果你想保持格式化,那麼這裏的另一個想法:從降價

  • 轉換爲HTML。
  • 使用一種解析器運行HTML,該解析器將爲您提供令牌流(例如,Perl的HTML::TokeParser::Simple,但我相信Python有一些可比的功能 - 或者你可以將任何基於事件的解析器變成其中一種)。
  • 當您獲取元素標記時,將它們複製到輸出中,同時保留一堆未封閉的標記。
  • 當您獲得文本標記時,將它們複製到輸出中,同時保持您輸出的文本數量的計數。
  • 當您得到一個文本令牌會超出限制時,只複製足夠的字符以達到限制,爲堆棧中任何未封閉的標籤生成結束標籤並停止處理。

如果你是用任意的HTML做這件事,那麼你會有很多奇怪的事情需要擔心,但是因爲你是來自降價,它應該實際上工作得很好。任何體面的降價轉換器都應該生成格式良好的HTML,其中包含相當少量的標籤。

2

事實上,最簡單和最安全的方法是從Markdown源生成HTML,將其轉換爲純文本(請參閱html2plaintext),然後將其修剪爲300個字符。

一個更有效的方法可能是修改Markdown解析器,只輸出所有文本節點的前300個字符,但我真的不認爲這些修改是合理的性能優勢。

+0

這就是StackOverflow正在做的事情,不是嗎?顯示問題列表的純文本。 – GSerg 2010-10-02 00:18:35

1

不知道它是否適用於Python,但this tutorial可能會幫助你。基本上它會在文本被修剪並自動關閉之後掃描未封閉的標籤。

+0

該教程中的*想法*是正確的。本教程提供的代碼很糟糕,最好不要看它:) – hobbs 2010-10-02 00:41:24

1

使用均衡的解析器,忽略非文本事件,捕獲文本事件,直到達到300個字符,然後停止解析。

libxml支持基於事件的html解析。我確定有一個降價,但沒有看。

您應該測量,以確保性能優勢值得追加的複雜性。

相關問題