Thomas Daniels
Если у вас есть HtmlDocument
(используя HtmlAgilityPack), вы можете использовать .DocumentNode.Descendants()
чтобы получить все потомки и использовать методы расширения LINQ, вы можете найти элемент, содержащий "образец текста", и получить его класс:
string html = @"<!DOCTYPE html>
<html>
<head><title>Sample document</title></head>
<body>
<div class=""sampleclass"">
Sample Text
</div>
</body>
</html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
HtmlNode foundNode = doc.DocumentNode.Descendants().Where(x => x.InnerHtml.Trim() == "Sample Text").FirstOrDefault();
string classAttribute = foundNode?.Attributes["class"]?.Value;
.Где[
^] фильтрует потомков с помощью предиката
x => x.InnerHtml.Trim() == "Sample Text"
, что означает, что для элемента 'x' в списке потомков обрезанный InnerHTML 'x' должен быть "образцом текста".
.Метода firstordefault[
^] возвращает первый найденный элемент, или
null
если никакой элемент не найден.
Когда узел найден, атрибут извлекается из узла. Обратите внимание, что я использовал
?.
вместо того, чтобы просто
.
потому что
?.
это
оператор[
^].
foundNode?.Attributes["class"]
означает "
если foundNode имеет значение NULL, то значением этого выражения является значение NULL; если foundNode не является нулем, то данное выражение выполняет .Класс атрибута"]".
?.Value
работает точно так же. Использование этого оператора позволяет избежать нескольких
null
проверки. Если
foundNode
является нулевым или если у него нет атрибута класса, то
classAttribute
это тоже ноль.