如何获得有效的前300个字符的HTML或Markdown?

时间:2010-10-02 00:05:27

标签: html markdown

我正在使用Python和Flask创建一个博客(以及网站的其余部分)。博客帖子使用Markdown编写,并使用创造性名称Markdown in Python转换为HTML。 Markdown(用于将来编辑)和HTML(用于显示)都存储在数据库中。

我希望能够自动获取文字的前300个字符(或500或200 - 我还没有算出数字)在我不想要的时候在页面上使用显示完整的博客文章(如首页)。但问题是,任何简单的方法都可能可能使我无法使用HTML或Markdown

HTML:

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

如果我得到了前10个字符,它会让我离开格式化,我会以某种方式关闭<strong><p>标记。< / p>

降价:

*Here* is **formatted** text.

同样,获取前十个字符将使我需要关闭**以获取粗体。

有什么方法可以做到这一点而无需编写HTML或Markdown解析器?或者,我最好将HTML转换为纯文本吗?

4 个答案:

答案 0 :(得分:2)

事实上,最简单,最安全的方法是从Markdown源生成HTML,将其转换为纯文本(请参阅html2plaintext),然后将其修剪为300个字符。

更有效的方法可能是修改Markdown解析器以仅输出所有文本节点的前300个字符,但我真的不认为这些修改证明了性能优势。

答案 1 :(得分:2)

如果你的摘要只是纯文本,那么Adam的回答肯定是最好的 - 首先转换为纯文本,然后截断。

如果你想保持格式化,那么这是另一个想法:

  • 从Markdown转换为HTML。
  • 使用一种解析器运行HTML,该解析器将为您提供令牌流(例如Perl的HTML::TokeParser::Simple,但我确信有类似于Python的东西 - 或者您可以转换任何基于事件的解析器进入其中一个)。
  • 当你获得元素标记时,将它们复制到输出中,同时保留一堆未封闭的标记。
  • 当您获得文本标记时,将它们复制到输出中,同时保持您输出的文本数量。
  • 当你找到一个超出限制的文本标记时,只复制足够的字符以达到限制,为堆栈上任何未关闭的标记生成结束标记,然后停止处理。

如果您使用任意HTML进行此操作,那么您可能需要担心许多奇怪的事情,但是因为您来自降价,它实际上应该可以正常工作。任何体面的降价转换器都应该生成结构良好的HTML,其中包含相当少量的标签。

答案 2 :(得分:1)

不知道它是否适用于Python,但this tutorial可能会对您有所帮助。基本上它会在修剪文本并自动关闭它后扫描未关闭的标记。

答案 3 :(得分:1)

使用偶数解析器,忽略非文本事件,捕获文本事件,直到达到300个字符,然后停止解析。

libxml支持基于事件的html解析。我确定有一个用于降价,但还没看过。

您应该进行衡量,以确保性能优势值得增加复杂性。