使用AngleSharp

时间:2016-01-28 16:06:33

标签: c# anglesharp

我使用下面的代码使用AngleSharp从解析的html中删除特定的html标记(因为建议使用正则表达式来执行此类作业(AngleSharp当前正在维护,HtmlAgilityPack不,因此我一直在转向后者。)

效果很好 - 但现在我想要删除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;
}

1 个答案:

答案 0 :(得分:3)

在使用上面的代码和AngleSharp的API之后,我提出了以下工作解决方案。 最初我以为我可以替换所有我的标签删除内容并且仅依赖于处理文本节点,但这不是值得推荐的, 因为一些文本节点将通过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);
}