HTML-навигация – С#
Используя библиотеку классов Aspose.HTML, вы можете легко создать собственное приложение, поскольку наш API предоставляет мощный набор инструментов для анализа и сбора информации из HTML-документов.
В этой статье содержится информация о том, как программно извлекать данные из HTML-документов с помощью Aspose.HTML API. Вы узнаете:
- как перемещаться по HTML-документу и выполнять детальную проверку его элементов с помощью API;
- об использовании пользовательских фильтров для перебора элементов документа;
- как перемещаться по документу с помощью CSS Selector или XPath Query.
HTML-навигация
Пространство имен Aspose.HtmlDom (объектная модель документа) предоставляет API, который представляет и взаимодействует с любыми документами HTML, XML или SVG и полностью основан на поддерживаемой спецификации WHATWG DOM. во многих современных браузерах. DOM – это модель документа, загруженная в браузер и представляющая документ в виде дерева узлов, где каждый узел представляет часть документа (например, элемент, текстовую строку или комментарий).
We consider how the DOM represents an HTML document in memory and how to use API for navigation through HTML files. Many ways can be used to make HTML navigation. The following shortlist shows the simplest way to access all DOM elements:
Property | Description |
---|---|
FirstChild | Accessing this property of an element must return a reference to the first child node. |
LastChild | Accessing this property of an element must return a reference to the last child node |
NextSibling | Accessing this property of an element must return a reference to the sibling node of that element which most immediately follows that element. |
PreviousSibling | Accessing this property of an element must return a reference to the sibling node of that element which most immediately precedes that element. |
ChildNodes | Returns a list that contains all children of that element. |
Четыре свойства класса Node – FirstChild, LastChild, NextSibling и PreviousSibling, каждое из которых предоставляет живую ссылку на другой элемент. с определенной связью с текущим элементом, если связанный элемент существует. Полный список классов и методов, представленных в пространстве имен Aspose.Html.Dom, вы найдете в Справочнике API.
Используя упомянутые свойства, вы можете перемещаться по HTML-документу следующим образом:
1// For complete examples and data files, please go to https://github.com/aspose-html/Aspose.HTML-for-.NET
2// Prepare HTML code
3var html_code = "<span>Hello</span> <span>World!</span>";
4
5// Initialize a document from the prepared code
6using (var document = new Aspose.Html.HTMLDocument(html_code, "."))
7{
8 // Get the reference to the first child (first SPAN) of the BODY
9 var element = document.Body.FirstChild;
10 Console.WriteLine(element.TextContent); // output: Hello
11
12 // Get the reference to the whitespace between html elements
13 element = element.NextSibling;
14 Console.WriteLine(element.TextContent); // output: ' '
15
16 // Get the reference to the second SPAN element
17 element = element.NextSibling;
18 Console.WriteLine(element.TextContent); // output: World!
19}
Проверка HTML-документа и его элементов
Aspose.HTML содержит список методов, основанных на Спецификациях обхода элементов. Вы можете выполнить детальную проверку документа и его элементов с помощью API. В следующем примере кода показано обобщенное использование функций обхода элементов.
1//Load a document from a file
2string documentPath = System.IO.Path.Combine(DataDir, "html_file.html");
3using (var document = new Aspose.Html.HTMLDocument(documentPath))
4{
5 // Get the html element of the document
6 var element = document.DocumentElement;
7 Console.WriteLine(element.TagName); // HTML
8
9 // Get the last element of the html element
10 element = element.LastElementChild;
11 Console.WriteLine(element.TagName); // BODY
12
13 // Get the first element of the body element
14 element = element.FirstElementChild;
15 Console.WriteLine(element.TagName); // H1
16 Console.WriteLine(element.TextContent); // Header 1
17}
Note: You need to specify the path to the source HTML file in your local file system (documentPath
).
Свойство
DocumentElement класса Document дает прямой доступ к элементу <html>
документа (
html_file.html). Свойство LastElementChild класса Document возвращает последний дочерний элемент элемента <html>
. Это элемент <body>
. Согласно приведенному выше фрагменту кода, переменная element снова перегружается, и свойство FirstElementChild возвращает первый дочерний элемент элемента <body>
. Это элемент <h1>
.
Использование пользовательского фильтра
Для более сложных сценариев, когда вам нужно найти узел по определенному шаблону (например, получить список заголовков, ссылок и т. д.), вы можете использовать специализированный TreeWalker или объект NodeIterator с реализация пользовательского Filter.
В следующем примере показано, как реализовать собственный NodeFilter, чтобы пропустить все элементы, кроме изображений:
1// For complete examples and data files, please go to https://github.com/aspose-html/Aspose.HTML-for-.NET
2class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
3{
4 public override short AcceptNode(Aspose.Html.Dom.Node n)
5 {
6 // The current filter skips all elements, except IMG elements.
7 return string.Equals("img", n.LocalName)
8 ? FILTER_ACCEPT
9 : FILTER_SKIP;
10 }
11}
1// For complete examples and data files, please go to https://github.com/aspose-html/Aspose.HTML-for-.NET
2// Prepare HTML code
3var code = @"
4 <p>Hello</p>
5 <img src='image1.png'>
6 <img src='image2.png'>
7 <p>World!</p>";
8
9// Initialize a document based on the prepared code
10using (var document = new Aspose.Html.HTMLDocument(code, "."))
11{
12 // To start HTML navigation we need to create an instance of TreeWalker.
13 // The specified parameters mean that it starts walking from the root of the document, iterating all nodes and use our custom implementation of the filter
14 using (var iterator = document.CreateTreeWalker(document, Aspose.Html.Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
15 {
16 while (iterator.NextNode() != null)
17 {
18 // Since we are using our own filter, the current node will always be an instance of the HTMLImageElement.
19 // So, we don't need the additional validations here.
20 var image = (Aspose.Html.HTMLImageElement)iterator.CurrentNode;
21
22 System.Console.WriteLine(image.Src);
23 // output: image1.png
24 // output: image2.png
25 }
26 }
27}
XPath-запрос
Альтернативой HTML-навигации является XPath Query ( XML Path Language), который часто называют просто XPath. Это язык запросов, который можно использовать для запроса данных из HTML-документов. Он основан на DOM-представлении HTML-документа и выбирает узлы по различным критериям. Синтаксис выражений XPath довольно прост, и, что более важно, его легко читать и поддерживать.
В следующем примере показано, как использовать запросы XPath в Aspose.HTML API:
1// For complete examples and data files, please go to https://github.com/aspose-html/Aspose.HTML-for-.NET
2// Prepare HTML code
3var code = @"
4 <div class='happy'>
5 <div>
6 <span>Hello!</span>
7 </div>
8 </div>
9 <p class='happy'>
10 <span>World</span>
11 </p>
12";
13
14// Initialize a document based on the prepared code
15using (var document = new Aspose.Html.HTMLDocument(code, "."))
16{
17 // Here we evaluate the XPath expression where we select all child SPAN elements from elements whose 'class' attribute equals to 'happy':
18 var result = document.Evaluate("//*[@class='happy']//span",
19 document,
20 null,
21 Aspose.Html.Dom.XPath.XPathResultType.Any,
22 null);
23
24 // Iterate over the resulted nodes
25 for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
26 {
27 System.Console.WriteLine(node.TextContent);
28 // output: Hello
29 // output: World!
30 }
31}
Селектор CSS
Наряду с HTML Navigation и XPath вы можете использовать API селектора CSS, который также поддерживается нашей библиотекой. Этот API предназначен для создания шаблона поиска для сопоставления элементов в дереве документов на основе синтаксиса CSS Selectors.
В следующем примере мы используем метод QuerySelectorAll() для навигации по HTML-документу и поиска необходимых элементы. Этот метод принимает в качестве параметра селектор запроса и возвращает NodeList всех элементов, соответствующих указанному селектору.
1// For complete examples and data files, please go to https://github.com/aspose-html/Aspose.HTML-for-.NET
2// Prepare HTML code
3var code = @"
4 <div class='happy'>
5 <div>
6 <span>Hello</span>
7 </div>
8 </div>
9 <p class='happy'>
10 <span>World!</span>
11 </p>
12";
13
14// Initialize a document based on the prepared code
15using (var document = new Aspose.Html.HTMLDocument(code, "."))
16{
17 // Here we create a CSS Selector that extract all elements whose 'class' attribute equals to 'happy' and their child SPAN elements
18 var elements = document.QuerySelectorAll(".happy span");
19
20 // Iterate over the resulted list of elements
21 foreach (Aspose.Html.HTMLElement element in elements)
22 {
23 System.Console.WriteLine(element.InnerHTML);
24 // output: Hello
25 // output: World!
26 }
27}
Aspose.HTML предлагает бесплатные Веб-приложения HTML, которые представляют собой онлайн-коллекцию конвертеров, слияний, загрузчиков, инструментов SEO, генераторов HTML-кода, инструментов URL и многое другое. Приложения работают в любой операционной системе с веб-браузером и не требуют установки дополнительного программного обеспечения. Легко конвертируйте, объединяйте, кодируйте, генерируйте HTML-код, извлекайте данные из Интернета или анализируйте веб-страницы с точки зрения SEO, где бы вы ни находились. Используйте нашу коллекцию веб-приложений HTML, чтобы выполнять повседневные дела и сделать свой рабочий процесс безупречным!