Web Scraping es una técnica utilizada para extraer datos de sitios web. Ayuda a automatizar el proceso de extracción de datos de sitios web y archivos HTML. Como desarrollador de C#, podemos inspeccionar, capturar y extraer datos fácilmente, como imágenes, video, audio, etc., de las páginas web. En este artículo, aprenderemos cómo realizar web scraping con análisis HTML usando C#.
En este artículo se tratarán los siguientes temas:
- API de raspado web de C#
- Leer y extraer HTML usando C#
- Inspeccionar elementos del documento usando C#
- Encuentre un elemento específico usando filtros en C#
- Consultar datos de HTML usando C#
- Extraer usando CSS Selector en C#
API de raspado web de C#
Para el web scraping de archivos HTML o URL, utilizaremos Aspose.HTML para .NET API. Es una API de procesamiento HTML avanzada que permite generar, modificar, extraer datos, convertir y renderizar documentos HTML sin ningún software externo. Descargue la DLL de la API o instálela usando NuGet.
PM> Install-Package Aspose.Html
Leer y extraer HTML usando C#
Podemos leer y extraer HTML de cualquier documento HTML siguiendo los pasos que se detallan a continuación:
- Cargue un documento HTML utilizando la clase HTMLDocument.
- Muestre el HTML interno del archivo en la consola.
El siguiente ejemplo de código muestra cómo leer y extraer contenido HTML mediante C#.
// Este ejemplo de código demuestra cómo mostrar el contenido de un documento HTML
// Cargar documento HTML
var document = new HTMLDocument(@"D:\Files\html\input.html");
// Mostrar HTML interno del documento
Console.WriteLine(document.Body.InnerHTML);
De manera similar, podemos leer y extraer HTML de sitios web en vivo como se muestra a continuación:
// Este ejemplo de código demuestra cómo mostrar contenido de la URL del sitio web en vivo.
// Inicializar URL
Url url = new Url("https://en.wikipedia.org/wiki/HTML");
// Cargue el archivo HTML usando la instancia de Url
HTMLDocument document = new HTMLDocument(url);
// Mostrar HTML interno del archivo a la consola
Console.WriteLine(document.Body.InnerHTML);
Inspeccionar elementos del documento usando C#
Podemos inspeccionar el documento y sus elementos siguiendo los pasos que se detallan a continuación:
- Cargue un documento HTML utilizando la clase HTMLDocument.
- Obtenga el elemento HTML del documento.
- Obtenga los primeros/últimos elementos del elemento HTML.
- Mostrar detalles del elemento como TagName, TextContent.
El siguiente ejemplo de código muestra cómo inspeccionar los elementos del documento mediante C#.
// Este ejemplo de código demuestra cómo inspeccionar elementos HTML.
// Cargar un documento desde un archivo
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new HTMLDocument(documentPath);
// Obtener el elemento html del documento
var element = document.DocumentElement;
Console.WriteLine(element.TagName); // HTML
// Obtener el último elemento del elemento html
element = element.LastElementChild;
Console.WriteLine(element.TagName); // BODY
// Obtener el primer elemento del elemento del cuerpo.
element = element.FirstElementChild;
Console.WriteLine(element.TagName); // H1
Console.WriteLine(element.TextContent); // Header 1
Encuentre un elemento específico usando filtros en C#
Podemos usar filtros personalizados para encontrar un elemento específico, como obtener todas las imágenes, enlaces, etc. Para este propósito, la API proporciona la interfaz TreeWalker. Permite navegar por un árbol o subárbol de documentos usando la vista del documento definida por sus banderas y filtros whatToShow (si los hay). Podemos encontrar elementos específicos usando filtros siguiendo los pasos que se detallan a continuación:
- Defina filtros usando la clase NodeFilter y anule el método AcceptNode().
- Cargue un documento HTML utilizando la clase HTMLDocument.
- Llame al método CreateTreeWalker(). Toma el nodo raíz, qué mostrar y NodeFilter como argumentos.
El siguiente ejemplo de código muestra cómo encontrar elementos específicos mediante C#.
// Este ejemplo de código muestra cómo consultar datos mediante filtros.
// Cargar un documento HTML
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");
// Para iniciar la navegación HTML necesitamos crear una instancia de TreeWalker.
// Los parámetros especificados significan que comienza a caminar desde la raíz del documento,
// iterando todos los nodos y usando nuestra implementación personalizada del filtro
using (var iterator = document.CreateTreeWalker(document, Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
while (iterator.NextNode() != null)
{
// Como estamos usando nuestro propio filtro, el nodo actual siempre será una instancia de HTMLImageElement.
// Por lo tanto, no necesitamos las validaciones adicionales aquí.
var image = (HTMLImageElement)iterator.CurrentNode;
System.Console.WriteLine(image.Src);
// salida: imagen1.png
// salida: imagen2.png
}
}
// Este ejemplo de código muestra cómo definir el filtro Node.
class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
public override short AcceptNode(Aspose.Html.Dom.Node n)
{
// El filtro actual omite todos los elementos, excepto los elementos IMG.
return string.Equals("img", n.LocalName)
? FILTER_ACCEPT
: FILTER_SKIP;
}
}
Consultar datos de HTML usando C#
También podemos usar XPath Query para consultar datos de un documento HTML siguiendo los pasos que se detallan a continuación:
- Cargue un documento HTML utilizando la clase HTMLDocument.
- Llame al método Evaluate(). Toma la cadena de expresión XPath, el documento y el tipo como argumentos.
- Finalmente, recorra los nodos resultantes y muestre el texto
El siguiente ejemplo de código muestra cómo consultar datos con consultas XPath mediante C#.
// Este ejemplo de código muestra cómo consultar datos mediante la consulta XPath.
// Preparar un código HTML
var code = @"
<div class='happy'>
<div>
<span>Hello!</span>
</div>
</div>
<p class='happy'>
<span>World</span>
</p>
";
// Inicializar un documento basado en el código preparado
HTMLDocument document = new HTMLDocument(code, ".");
// Aquí evaluamos la expresión XPath donde seleccionamos todos los elementos secundarios SPAN
// de elementos cuyo atributo 'clase' es igual a 'feliz':
var result = document.Evaluate("//*[@class='happy']//span",
document,
null,
Aspose.Html.Dom.XPath.XPathResultType.Any,
null);
// Iterar sobre los nodos resultantes
for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
{
System.Console.WriteLine(node.TextContent);
// salida: hola
// salida: ¡Mundo!
}
Extraer usando CSS Selector en C#
También podemos extraer contenido HTML usando selectores CSS. Para ello, la API proporciona el método QuerySelectorAll() que permite navegar por un documento HTML y buscar los elementos necesarios. Toma el selector de consultas como parámetro y devuelve una lista de nodos coincidente de todos los elementos. Podemos consultar usando selectores de CSS siguiendo los pasos que se detallan a continuación:
- Cargue un documento HTML utilizando la clase HTMLDocument.
- Llame al método QuerySelectorAll(). Toma el selector de consultas como argumento.
- Finalmente, recorra la lista de elementos resultante.
El siguiente ejemplo de código muestra cómo extraer contenido HTML mediante selectores de CSS en C#.
// Inicializar un documento basado en el código preparado
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");
// Aquí creamos un Selector CSS que extrae todos los elementos div
var elements = document.QuerySelectorAll("div");
// Iterar sobre la lista de elementos resultante
foreach (Aspose.Html.HTMLElement element in elements)
{
System.Console.WriteLine(element.InnerHTML);
}
Obtenga una licencia gratis
Pruebe la API sin limitaciones de evaluación solicitando una licencia temporal gratuita.
Conclusión
En este artículo, hemos aprendido a:
- leer y extraer el contenido de un documento HTML usando C#;
- inspeccionar los elementos del documento y encontrar un elemento específico de HTML;
- consulta datos específicos y extrae datos usando CSS Selector.
Además, puede obtener más información sobre Aspose.HTML para .NET API utilizando la documentación. En caso de cualquier ambigüedad, no dude en contactarnos en el foro.