2017-04-21 131 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開箱 - 也許這已經相當接近你想要的東西(一個「漂亮」的標記格式)。

希望這會有所幫助!