【问题标题】:Strip parsed html text from html comments using AngleSharp使用 AngleSharp 从 html 注释中去除已解析的 html 文本
【发布时间】:2016-01-28 16:06:33
【问题描述】:

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

效果很好 - 但现在我也想删除 html cmets。表示在 <!----> 标签之间找到的任何内容。

如何使用 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;
}

【问题讨论】:

    标签: c# anglesharp


    【解决方案1】:

    在使用了上面的代码和 AngleSharp 的 API 之后,我想出了以下可行的解决方案。 最初我以为我可以替换我所有的标签删除东西,只依靠处理文本节点,但这是不推荐的, 由于某些文本节点将通过 javascript 代码即时生成,这意味着无论如何您都需要删除 javascript 节点。所以我也离开了 style + img 移除。

    还值得一提的是,DOM根据类型对节点进行分类,通过搜索类型8的节点可以找到cmet。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 2023-03-07
      相关资源
      最近更新 更多