Obtener el objeto de documento
1. Crear el objeto de documento
HtmlDocument document = new HtmlDocument();Lenguaje del código: JavaScript (javascript)
2. Dos formas de carga
1)Cargar cadena HTML
document.LoadHtml(htmlString);Lenguaje del código: JavaScript (javascript)
2)Cargar archivo HTML local (especifica codificación para evitar caracteres corruptos)
document.Load(@"c:/news.html", Encoding.UTF8);Lenguaje del código: JavaScript (javascript)
Para rutas Windows se recomienda usar
@para desactivar el escape;c://news.htmldel material didáctico es solo un ejemplo de sintaxis.
3. Obtener el nodo raíz
HtmlNode rootNode = document.DocumentNode;Lenguaje del código: JavaScript (javascript)
Todas las consultas XPath se ejecutan tomando rootNode como base.
Operaciones con nodos
1. Crear nuevo nodo a partir del HTML de otro nodo
HtmlNode newNode = HtmlNode.CreateNode(newsNode.OuterHtml);
OuterHtml: Incluye su propia etiqueta junto con todo el contenido HTML interno- Se usa habitualmente para copiar nodos o analizar fragmentos HTML por separado
2. Consultar nodos
SelectSingleNode("XPath"): Devuelve el primer nodo coincidente, tipo de retornoHtmlNode
HtmlNode childNode = itemNode.SelectSingleNode("//div[1]");Lenguaje del código: JavaScript (javascript)
SelectNodes("XPath"): Devuelve todos los nodos coincidentes, tipo de retornoHtmlNodeCollection
3. Leer texto y atributos
- Obtener texto plano contenido dentro del nodo
string text = itemNode.InnerText;
- Leer atributo de etiqueta (escritura básica)
string href = itemNode.Attributes["href"].Value;Lenguaje del código: JavaScript (javascript)
Riesgo: Si la etiqueta no cuenta con el atributo
href, el acceso directoAttributes["href"]devuelve null y provoca errores en el código.
Escritura segura recomendada:
string href = itemNode.GetAttributeValue("href", "");Lenguaje del código: JavaScript (javascript)
4. Código completo: recorrer lista de noticias
foreach (HtmlNode item in newsList)
{
string title = item.InnerText;
string href = item.Attributes["href"].Value;
}Lenguaje del código: PHP (php)
Observaciones adicionales
- Problema de valores nulos
SelectNodes()devuelvenullcuando no encuentra nodos coincidentes, debes comprobarlo antes de hacer el recorrido foreach:
if(newsList != null)
{
foreach(var item in newsList){ ... }
}Lenguaje del código: PHP (php)
- Diferencias entre InnerText / InnerHtml / OuterHtml
InnerText: Extrae solo texto, elimina todas las etiquetasInnerHtml: HTML interno del nodo, sin su propia etiquetaOuterHtml: Su propia etiqueta más todo el HTML interno
- Consejo rápido de XPath
//divrealiza una búsqueda global de todos los div; si omites//solo coincide con nodos hijos directos.
Ejemplo completo
using HtmlAgilityPack;
using System.Text;
//1.Inicializar documento
HtmlDocument document = new HtmlDocument();
document.Load("news.htm", Encoding.UTF8);
HtmlNode rootNode = document.DocumentNode;
//2.Consultar en lote enlaces de noticias
HtmlNodeCollection newsList = rootNode.SelectNodes(@"//div[@class='blk122']/a");
if(newsList != null)
{
foreach (HtmlNode item in newsList)
{
string title = item.InnerText.Trim();
string link = item.GetAttributeValue("href", "");
Console.WriteLine($"Título: {title} Enlace: {link}");
}
}Lenguaje del código: JavaScript (javascript)
Obtener contenido del documento
Previous: Aplicación práctica