【问题标题】:AngleSharp extracting formatted textAngleSharp 提取格式化文本
【发布时间】:2017-04-21 10:39:22
【问题描述】:

我想知道是否可以使用 AngleSharp 从 HTMLDocument 中提取格式化文本。我正在使用以下代码来提取文本。我遇到的问题是提取的文本一起运行,每个元素之间没有中断。

var parser = new HtmlParser();
var document = parser.Parse("<script>var x = 1;</script> <h1>Some example source</h1><p>This is a paragraph element</p>");
var text = document.Body.Text();

这将返回以下文本

一些示例来源这是一个段落元素

理想情况下,我希望它返回 一些示例来源这是一个段落元素 每个节点文本值之间存在一些分隔。

【问题讨论】:

  • 由于文档中没有分隔,因此返回的文本中不会有任何内容。如果你想要这样的东西,你必须手动处理文档结构并决定在哪里放置分隔符。
  • 感谢 Sami 的回复,我很感激这个事实,这是一个如此频繁的要求,我希望它可以作为库的一部分提供。特别是在需要解析 HTML 文档中的文本的情况下。例如,在说 Elastic Search 中提取文本内容和索引将是每天都会发生的事情。

标签: c# anglesharp


【解决方案1】:

我知道我迟到了,但迟到总比没有好(我也希望其他人能从这个答案中受益)。

问题上的cmets都是正确的。一方面,我们有 W3C 规范和文档的来源,它告诉我们(官方)序列化中不会有任何空间,另一方面,我们有一个很常见的情况,可以在适用时“整合”一些空间(或者甚至可能是换行符,例如,如果看到 &lt;br&gt; 元素)。

正在编写的库不知道您的具体用例(即,当 想要插入空格时)。但是,它可以帮助您更轻松地达到您想要的状态

从 DOM 到字符串的序列化是通过实现 IMarkupFormatter 的类的实例完成的。任何 DOM 节点的ToHtml() 方法都接受这样的对象来返回一个字符串。做一个

var myFormatter = new MyMarkupFormatter();
var text = document.Body.ToHtml(myFormatter);

现在问题简化为适用于我们的 MyMarkupFormatter 的实现。这个格式化程序基本上只会产生文本节点,但是,某些标签会被区别对待(即,返回 some 文本,例如空格)。

public class MyMarkupFormatter : IMarkupFormatter
{
    String IMarkupFormatter.Comment(IComment comment)
    {
        return String.Empty;
    }

    String IMarkupFormatter.Doctype(IDocumentType doctype)
    {
        return String.Empty;
    }

    String IMarkupFormatter.Processing(IProcessingInstruction processing)
    {
        return String.Empty;
    }

    String IMarkupFormatter.Text(ICharacterData text)
    {
        return text.Data;
    }

    String IMarkupFormatter.OpenTag(IElement element, Boolean selfClosing)
    {
        switch (element.LocalName)
        {
            case "p":
                return "\n\n";
            case "br":
                return "\n";
            case "span":
                return " ";
        }

        return String.Empty;
    }

    String IMarkupFormatter.CloseTag(IElement element, Boolean selfClosing)
    {
        return String.Empty;
    }

    String IMarkupFormatter.Attribute(IAttr attr)
    {
        return String.Empty;
    }
}

如果您不需要剥离所有非文本信息,那么 AngleSharp 还提供开箱即用的 PrettyMarkupFormatter - 也许这已经非常接近您想要的(“更漂亮”的标记格式化程序)。

希望这会有所帮助!

【讨论】:

  • 对于 2019 年末的任何人,IMarkupFormatter.Text 的参数现在是 ICharacterData,因此不要返回 text,而是返回 text.Data
  • 感谢@JosiahNunemaker - 调整!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2019-11-16
  • 2018-07-27
  • 1970-01-01
  • 2019-07-22
相关资源
最近更新 更多