2017-04-21 135 views
0

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

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是一个段落元素

理想我想它返回 一些示例源这是一个段落元素 那里是每个节点文本值之间的一些分离。

+0

由于文档中没有分隔,因此返回的文本中不会有任何内容。如果你想要这样的东西,你必须手动处理文档结构并决定放置分隔的位置。 –

+0

谢谢萨米的回复,我很欣赏这个事实,这是一个频繁的要求,我希望它可以作为图书馆的一部分。特别是在需要解析HTML文档中的文本时。例如,在Elastic Search中提取文本内容和索引是每天都会发生的事情。 – Bigtoe

回答

0

我知道我迟到了晚会,但迟到比从未好(也希望别人可以从这个答案中获益)。

对这个问题的评论都是对的。一方面,我们有W3C规范和文档的来源,它告诉我们在(官方)序列化中不会有任何空间,另一方面,我们有一个很常见的情况来在适用时“集成”一些空间(或者甚至可能换行,例如,如果看到一个<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开箱 - 也许这已经相当接近你想要的东西(一个“漂亮”的标记格式)。

希望这会有所帮助!