首页 > 解决方案 > HtmlAgilityPack 修改 html 并返回更新的内容

问题描述

我没有经常使用 HtmlAgilityPack 并且我被困在以下问题上。

我正在检查浏览器是否支持 WebP,如果支持,我会在图像的 src 中附加一个新参数。

我有这个工作,但我不知道如何返回更新的 HTML,任何帮助将不胜感激。

public static HtmlString AppendWebPString(HtmlString htmlText)
        {

            bool browserSupportsWebP = BrowserSupportsWebPHelper.WebPSupported();

            if (!browserSupportsWebP) return htmlText;

            var h = new HtmlDocument();
            h.LoadHtml(htmlText.ToString());

            const string webP = "&quality=80&format=webp";

            if (h.DocumentNode.SelectNodes("//img[@src]") == null) return htmlText;

            string imgOuterHtml = string.Empty;
            foreach (HtmlNode image in h.DocumentNode.SelectNodes("//img[@src]"))
            {
                var src = image.Attributes["src"].Value.Split('&');
                image.SetAttributeValue("src", src[1] + string.Format(webP));
                imgOuterHtml = image.OuterHtml;
            }

            //How do I return the updated html here
            return new HtmlString(h.ParsedText);
        }

标签: c#.nethtml-agility-pack

解决方案


好的,我找不到任何内置在敏捷包中的东西来做我想做的事。

使用下面的代码后,我设法实现了我的目标

public static HtmlString AppendWebPString(HtmlString htmlText)
        {

            bool browserSupportsWebP = BrowserSupportsWebPHelper.WebPSupported();

            if (!browserSupportsWebP) return htmlText;

            var h = new HtmlDocument();
            h.LoadHtml(htmlText.ToString());

            const string webP = "&quality=80&format=webp";

            if (h.DocumentNode.SelectNodes("//img[@src]") == null) return htmlText;

            string modifiedHtml = htmlText.ToString();

            List<ReplaceImageValues> images = new List<ReplaceImageValues>();
            foreach (HtmlNode image in h.DocumentNode.SelectNodes("//img[@src]"))
            {

                var src = image.Attributes["src"].Value.Split('&');
                string oldSrcValue = image.OuterHtml;
                image.SetAttributeValue("src", src[0] + src[1] + string.Format(webP));
                string newSrcValue = image.OuterHtml;
                images.Add(new ReplaceImageValues(oldSrcValue,newSrcValue));
            }


            foreach (var newImages in images)
            {
                modifiedHtml = modifiedHtml.Replace(newImages.OldVal, newImages.NewVal);
            }
            return new HtmlString(modifiedHtml);
        }

推荐阅读