2017-04-21 2 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> 요소가 보이는 경우).

라이브러리가 작성되면 라이브러리가 특정 유스 케이스를 알지 못합니다 (예 : 공백 삽입). 그러나 을 더 쉽게 얻을 수 있도록 도와 드릴 수 있습니다 to 원하는 상태.

DOM에서 문자열로의 직렬화는 IMarkupFormatter을 구현하는 클래스의 인스턴스를 통해 수행됩니다. DOM 노드의 ToHtml() 메소드는 문자열을 반환하는 객체를 허용합니다. Doing a

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

이제 우리에게 맞는 MyMarkupFormatter 구현에 대한 질문이 줄어 들었습니다. 이 형식 지정 도구는 본질적으로 텍스트 노드 만 생성하지만 특정 태그는 다르게 취급됩니다 (즉, 공백과 같은 일부 텍스트를 반환). 어쩌면이 이미 (는 "예뻐"마크 업 포매터를) 원하는 것을 아주 가까운 - 모든 텍스트가 아닌 정보를 제거하는 것은 당신이 AngleSharp는 상자 밖으로 PrettyMarkupFormatter을 제공 한 후 필요없는 경우

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; 
    } 
} 

.

희망이 도움이됩니다.