AngleSharp提取格式化文本

时间:2017-04-21 10:39:22

标签: c# anglesharp

我想知道是否可以使用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();

返回以下文字

一些示例sourceThis是一个段落元素

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

1 个答案:

答案 0 :(得分:1)

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

对这个问题的评论都是正确的。一方面我们有W3C规范和文档的来源,它告诉我们在(官方)序列化中没有任何空间,另一方面我们有一个相当常见的情况。 #34;整合&#34;适用时的某些空格(或者甚至是换行符,例如,如果看到<br>元素)。

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

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

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

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

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(String text)
    {
        return text;
    }

    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 - 也许这已经非常接近您想要的了(#34;更漂亮&#34;标记格式化程序)。

希望这有帮助!