代码之家  ›  专栏  ›  技术社区  ›  David Johnstone

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

  •  2
  • David Johnstone  · 技术社区  · 14 年前

    我正在使用python和 Flask . 博客文章以降价方式编写,并使用创造性命名的HTML转换为HTML。 Markdown in Python . 标记(供将来编辑)和HTML(供显示)都存储在数据库中。

    我希望能自动获取前300个字符的文本 (或者500,或者200,我还没有计算出数字)当我不想显示完整的博客文章(比如在首页)时,可以在页面上使用。然而,问题是任何简单的方法都会 可能会给我留下无效的HTML或标记 :

    HTML:

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

    如果我得到这个的前十个字符,它会让我走到一半 格式化 我需要关闭 <strong> <p> 标签。

    降价:

    *Here* is **formatted** text.
    

    同样,获得前十个字符将使我需要关闭 ** 为了大胆。

    有没有什么方法可以做到这一点而不需要编写一个HTML或降价解析器? 或者,我最好把HTML转换成纯文本?

    4 回复  |  直到 14 年前
        1
  •  2
  •   hobbs    14 年前

    如果你对摘要只是纯文本的理解是正确的,那么亚当的答案肯定是最好的——先转换为纯文本,然后截断。

    如果您想保持格式,那么还有一个想法:

    • 从Markdown转换为HTML。
    • 在HTML中运行一个解析器,它将为您提供一个令牌流(例如Perl的 HTML::TokeParser::Simple ,但我敢肯定有类似于Python的东西——或者您可以将任何基于事件的解析器转换为这些解析器中的一个)。
    • 当您获得元素标记时,将它们复制到输出,同时维护一堆未关闭的标记。
    • 当您获得文本标记时,将它们复制到输出,同时保持输出的文本量的计数。
    • 当你得到一个超过限制的文本标记时,只复制足够的字符来达到限制,为堆栈上任何未关闭的标记生成结束标记,并停止处理。

    如果你用任意的HTML来做这件事,那么你会有很多奇怪的事情需要担心,但是既然你是从降价开始的,它实际上应该可以很好地工作。任何合适的降价转换器都应该生成格式良好的HTML,其中包含相当少的标记。

        2
  •  2
  •   Adam    14 年前

    实际上,最简单和最安全的方法是从标记源代码生成HTML,并将其转换为纯文本(请参见 html2plaintext ,然后将其缩小到300个字符。

    一个更有效的方法可能是修改markdown解析器,只输出所有文本节点的前300个字符,但我真的认为这些修改不能证明性能的好处。

        3
  •  1
  •   bangbambang    14 年前

    不知道它是否适用于python,但是 this tutorial 可能对你有帮助。基本上,它会在文本被剪裁后扫描未关闭的标签,并自动关闭它。

        4
  •  1
  •   Kris Selden    14 年前

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

    libxml支持基于事件的HTML解析。我肯定有一个是降价的,但还没看。

    不过,您应该衡量一下,以确保性能优势值得增加复杂性。