Обнаружение URI данных в изображении src с помощью HtmlAgilityPack

base64 c# html-agility-pack

Вопрос

Я обрабатываю много html и преобразовываю его в файлы PDF. Прежде чем я смогу преобразовать свой html, мне нужно определить, есть ли файлы ссылок на изображения. Если это файл, на который ссылается, тогда я base64 кодирую их и заменяю src на него.

Прямо сейчас я полагаюсь на Regex, чтобы сделать для меня обнаружение, но так как я использую HtmlAgilityPack, мне было интересно, могу ли я сделать то же самое с HtmlAgilityPack?

Я хотел бы сделать это, поэтому мне не нужно поддерживать Regex, когда я уже использую HtmlAgilityPack.

Так что прямо сейчас я обнаруживаю данные uri через RegEx со следующим:

void Main()
{
    var myHtml = @"<html><head></head><body><p><img src='data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs='/></p></body></html>";
    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(myHtml);

    var imgs = htmlDoc.DocumentNode.SelectNodes("//img");
    if (imgs != null && imgs.Count > 0)
    {
        foreach (var imgNode in imgs)
        {
            var srcAttribute = imgNode.Attributes.FirstOrDefault(a => string.Equals("src", a.Name, StringComparison.InvariantCultureIgnoreCase));

            if (!string.IsNullOrEmpty(srcAttribute?.Value) && !StringIsDataUri(srcAttribute.Value))
            {
                Console.WriteLine("BASE ENCODE THE REFERENCED FILE");
            }
        }
    }
}

//Regex from http://stackoverflow.com/a/5714355/1958344
private static Regex regex = new Regex(@"data:(?<mime>[\w/\-\.]+);(?<encoding>\w+),(?<data>.*)", RegexOptions.Compiled);

private bool StringIsDataUri(string stringToTest)
{
    var match = regex.Match(stringToTest);
    return match.Success;
}

Принятый ответ

HtmlAgilityPack не имеет встроенной функции для обнаружения URI данных, поэтому вам по-прежнему необходимо включить собственную реализацию такой функции.

В стороне, вы можете использовать LINQ API для HtmlAgilityPack, чтобы выбрать элемент img со ссылкой на атрибут src в первую очередь:

var referenceImgs = htmlDoc.DocumentNode
                           .Descendants("img")
                           .Where(o => !StringIsDataUri(o.GetAttributeValue("src","")));

foreach(HtmlNode img in referenceImgs)
{
    Console.WriteLine("BASE ENCODE THE REFERENCED FILE");
}


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow