Получайте и скачивайте картинки с AngleSharp

Я начал использовать Anglesharp для проекта, мне нужно получить и скачать не только HTML, но и изображения документа. Я знаю, что в объекте Document есть свойство с именем Images, но, по-видимому, оно не получает их всех, я провел тест на странице YouTube и получил только один (повторяется несколько раз). Например, я хотел бы получить thumbinail текущего видео, и это, кажется, внутри <meta> тег. Чтобы быть более точным, изображения хранятся внутри тегов такого типа:

<meta content="https://i.ytimg.com/vi/hW-kDv1WcQM/hqdefault.jpg" property="og:image">

Поэтому мне интересно, есть ли способ выбрать все узлы / URL любого изображения на странице, независимо от используемого тега. Я не думаю, что QuerySelectorAll работает в этом случае, так как это выбирает только один тип узла. Вы можете попробовать пример кода, который вы найдете на github, чтобы убедиться в этом (я только что изменил URL с помощью YouTube, и селектор тоже:D):

// Setup the configuration to support document loading
var config = Configuration.Default.WithDefaultLoader();
// Load the names of all The Big Bang Theory episodes from Wikipedia
var address  = "https://www.youtube.com/watch?v=hW-kDv1WcQM&feature=youtu.be";
// Asynchronously get the document in a new context using the configuration
var document = await BrowsingContext.New(config).OpenAsync(address);
// This CSS selector gets the desired content
var cellSelector = "img";
// Perform the query to get all cells with the content
var cells = document.QuerySelectorAll(cellSelector);
// We are only interested in the text - select it with LINQ
var titles = cells.Select(m => m.TextContent);

О, конечно, вы также можете добавить это, чтобы проверить, что свойство Image не получает видео thumbinails:

var Images = document.Images.Select(sl=> sl.Source).Distinct().ToList();

Любой другой метод для выбора узлов на основе содержимого URL? (как и все URL-адреса, заканчивающиеся на ".jpg" или ".png" и т. д.)

1 ответ

Вы можете использовать LINQ API, чтобы получить все атрибуты, которые содержат URL изображения на странице, например:

.....
var document = await BrowsingContext.New(config).OpenAsync(address);

//list all image file extension here :
var fileExtensions = new string[] { ".jpg", ".png" };

//find all attribute in any element...
//where the value ends with one of the listed file extension                     
var result = from element in document.All
             from attribute in element.Attributes
             where fileExtensions.Any(e => attribute.Value.EndsWith(e))
             select attribute;

foreach (var item in result)
{
    Console.WriteLine(item.Value);
}
Другие вопросы по тегам