2016-01-28 4 views
2

Я использую этот код, чтобы лишить конкретную HTML-тег из анализируемой HTML, используя AngleSharp (как это рекомендуется по сравнению с использованием регулярных выражений для выполнения таких работ (AngleSharp в настоящее время поддерживается, HtmlAgilityPack нет, следовательно, Я двигался к последнему)Strip разобран HTML текст из HTML комментариев с помощью AngleSharp

Он отлично работает. - но теперь я хочу, чтобы удалить HTML комментарии, а смысл все, что находится между <!-- и --> тегами

Как это может быть достигнуто с помощью AngleSharp..? Использование QuerySelector здесь не подходит.

private string ExtractContentFromHtml(string input) 
{ 
    List<string> tagsToRemove = new List<string> 
    { 
     "script", 
     "style", 
     "img" 
    }; 

    var config = Configuration.Default.WithJavaScript(); 

    HtmlParser hp = new HtmlParser(config); 
    List<IElement> tags = new List<IElement>(); 
    List<string> nodeTypes = new List<string>(); 
    var hpResult = hp.Parse(input); 

    try 
    { 
     foreach (var tagToRemove in tagsToRemove) 
      tags.AddRange(hpResult.QuerySelectorAll(tagToRemove)); 

     foreach (var tag in tags) 
      tag.Remove(); 
    } 
    catch (Exception ex) 
    { 
     _errors.Add(string.Format("Error in cleaning html. {0}", ex.Message)); 
    } 

    var content = hpResult.QuerySelector("body"); 

    return (content).InnerHtml; 
} 

ответ

3

После игры с кодом выше и API AngleSharp я придумал следующее рабочее решение. Первоначально я думал, что могу заменить все свои вещи для удаления тегов и только полагаться только на обработку текстовых узлов, но это не рекомендуется, , поскольку некоторые текстовые узлы будут генерироваться «на лету» через код javascript, то есть вам нужно удалить javascript узлов в любом случае. Поэтому я также оставил удаление стиля + img.

Стоит отметить также, что DOM классифицирует узлы по типам, и один в состоянии найти комментарии путем поиска узлов типа 8.

private string ExtractContentFromHtml(string input) 
{ 
    List<string> tagsToRemove = new List<string> 
    { 
     "script", 
     "style", 
     "img" 
    }; 

    var config = Configuration.Default.WithJavaScript(); 

    HtmlParser hp = new HtmlParser(config); 
    List<IElement> tags = new List<IElement>(); 
    List<string> nodeTypes = new List<string>(); 
    var hpResult = hp.Parse(input); 

    List<string> textNodesValues = new List<string>(); 
    try 
    { 
     foreach (var tagToRemove in tagsToRemove) 
      tags.AddRange(hpResult.QuerySelectorAll(tagToRemove)); 

     foreach (var tag in tags) 
      tag.Remove(); 



/* 
    the following will not work, because text nodes that are not immediate children will not be considered 
    textNodesValues = hpResult.All.Where(n => n.NodeType == NodeType.Text).Select(n => n.TextContent).ToList(); 
*/ 


     var treeWalker = hpResult.CreateTreeWalker(hpResult, FilterSettings.Text); 

     var textNode = treeWalker.ToNext(); 
     while (textNode != null) 
     { 
      textNodesValues.Add(textNode.TextContent); 
      textNode = treeWalker.ToNext(); 
     } 
    } 
    catch (Exception ex) 
    { 
     _errors.Add(string.Format("Error in cleaning html. {0}", ex.Message)); 
    } 

    return string.Join(" ", textNodesValues); 
} 
+0

Моя проблема сейчас в том, что есть теги сценариев, которые не являются удаляется ... – Veverke

Смежные вопросы