Il Web Scraping è una tecnica utilizzata per estrarre dati dai siti Web. Aiuta ad automatizzare il processo di estrazione dei dati da siti Web e file HTML. In qualità di sviluppatore C#, possiamo facilmente ispezionare, acquisire ed estrarre dati, come immagini, video, audio, ecc., dalle pagine Web. In questo articolo impareremo come eseguire il web scraping con l’analisi HTML usando C#.
In questo articolo verranno trattati i seguenti argomenti:
- API di scraping Web C#
- Leggi ed estrai HTML usando C#
- Ispeziona gli elementi del documento usando C#
- Trova elemento specifico usando i filtri in C#
- Eseguire query sui dati da HTML utilizzando C#
- Estrai usando il selettore CSS in C#
API di scraping Web C#
Per il web scraping da file HTML o URL, utilizzeremo l’API Aspose.HTML for .NET. È un’API di elaborazione HTML avanzata che consente di generare, modificare, estrarre dati, convertire e rendere documenti HTML senza alcun software esterno. Si prega di scaricare la DLL dell’API o installarla utilizzando NuGet.
PM> Install-Package Aspose.Html
Leggi ed estrai HTML usando C#
Possiamo leggere ed estrarre HTML da qualsiasi documento HTML seguendo i passaggi indicati di seguito:
- Carica un documento HTML utilizzando la classe HTMLDocument.
- Visualizza l’HTML interno del file sulla console.
L’esempio di codice seguente mostra come leggere ed estrarre contenuto HTML usando C#.
// Questo esempio di codice mostra come mostrare il contenuto del documento HTML
// Carica documento HTML
var document = new HTMLDocument(@"D:\Files\html\input.html");
// Mostra l'HTML interno del documento
Console.WriteLine(document.Body.InnerHTML);
Allo stesso modo, possiamo leggere ed estrarre HTML da siti Web live come mostrato di seguito:
// Questo esempio di codice mostra come mostrare i contenuti dall'URL del sito Web live.
// Inizializza URL
Url url = new Url("https://en.wikipedia.org/wiki/HTML");
// Carica il file HTML utilizzando l'istanza Url
HTMLDocument document = new HTMLDocument(url);
// Mostra l'HTML interno del file alla console
Console.WriteLine(document.Body.InnerHTML);
Ispeziona gli elementi del documento usando C#
Possiamo ispezionare il documento e i suoi elementi seguendo i passaggi indicati di seguito:
- Carica un documento HTML utilizzando la classe HTMLDocument.
- Ottieni l’elemento HTML del documento.
- Ottieni il primo/ultimo elemento dell’elemento HTML.
- Visualizza i dettagli degli elementi come TagName, TextContent.
L’esempio di codice seguente mostra come controllare gli elementi del documento usando C#.
// Questo esempio di codice mostra come controllare gli elementi HTML.
// Carica un documento da un file
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new HTMLDocument(documentPath);
// Ottieni l'elemento html del documento
var element = document.DocumentElement;
Console.WriteLine(element.TagName); // HTML
// Ottieni l'ultimo elemento dell'elemento html
element = element.LastElementChild;
Console.WriteLine(element.TagName); // BODY
// Ottieni il primo elemento dell'elemento body
element = element.FirstElementChild;
Console.WriteLine(element.TagName); // H1
Console.WriteLine(element.TextContent); // Header 1
Trova elemento specifico usando i filtri in C#
Possiamo utilizzare filtri personalizzati per trovare un elemento specifico come ottenere tutte le immagini, i collegamenti, ecc. A tale scopo, l’API fornisce l’interfaccia TreeWalker. Consente di navigare in un albero o sottoalbero di documenti utilizzando la vista del documento definita dai flag e dal filtro whatToShow (se presenti). Possiamo trovare elementi specifici utilizzando i filtri seguendo i passaggi indicati di seguito:
- Definire i filtri utilizzando la classe NodeFilter e sovrascrivere il metodo AcceptNode().
- Carica un documento HTML utilizzando la classe HTMLDocument.
- Chiama il metodo CreateTreeWalker(). Prende il nodo radice, cosa mostrare e NodeFilter come argomenti.
L’esempio di codice seguente mostra come trovare elementi specifici usando C#.
// Questo esempio di codice mostra come eseguire query sui dati usando i filtri.
// Carica un documento HTML
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");
// Per avviare la navigazione HTML è necessario creare un'istanza di TreeWalker.
// I parametri specificati indicano che inizia a camminare dalla radice del documento,
// iterare tutti i nodi e utilizzare la nostra implementazione personalizzata del filtro
using (var iterator = document.CreateTreeWalker(document, Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
while (iterator.NextNode() != null)
{
// Poiché stiamo usando il nostro filtro, il nodo corrente sarà sempre un'istanza di HTMLImageElement.
// Quindi, non abbiamo bisogno di ulteriori convalide qui.
var image = (HTMLImageElement)iterator.CurrentNode;
System.Console.WriteLine(image.Src);
// output: image1.png
// uscita: image2.png
}
}
// Questo esempio di codice illustra come definire il filtro Node.
class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
public override short AcceptNode(Aspose.Html.Dom.Node n)
{
// Il filtro corrente salta tutti gli elementi, ad eccezione degli elementi IMG.
return string.Equals("img", n.LocalName)
? FILTER_ACCEPT
: FILTER_SKIP;
}
}
Eseguire query sui dati da HTML utilizzando C#
Possiamo anche utilizzare XPath Query per interrogare i dati da un documento HTML seguendo i passaggi indicati di seguito:
- Carica un documento HTML utilizzando la classe HTMLDocument.
- Chiama il metodo Evaluate(). Prende la stringa dell’espressione XPath, il documento e il tipo come argomenti.
- Infine, scorrere i nodi risultanti e visualizzare il testo
Nell’esempio di codice seguente viene illustrato come eseguire query sui dati con query XPath usando C#.
// Questo esempio di codice mostra come interrogare i dati usando la query XPath.
// Prepara un codice HTML
var code = @"
<div class='happy'>
<div>
<span>Hello!</span>
</div>
</div>
<p class='happy'>
<span>World</span>
</p>
";
// Inizializzare un documento in base al codice preparato
HTMLDocument document = new HTMLDocument(code, ".");
// Qui valutiamo l'espressione XPath in cui selezioniamo tutti gli elementi SPAN figlio
// da elementi il cui attributo 'class' è uguale a 'happy':
var result = document.Evaluate("//*[@class='happy']//span",
document,
null,
Aspose.Html.Dom.XPath.XPathResultType.Any,
null);
// Iterare sui nodi risultanti
for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
{
System.Console.WriteLine(node.TextContent);
// uscita: Ciao
// uscita: Mondo!
}
Estrai usando il selettore CSS in C#
Possiamo anche estrarre il contenuto HTML usando i selettori CSS. A tale scopo, l’API fornisce il metodo QuerySelectorAll() che consente la navigazione in un documento HTML e la ricerca degli elementi necessari. Prende il selettore di query come parametro e restituisce un NodeList corrispondente di tutti gli elementi. Possiamo eseguire query utilizzando i selettori CSS seguendo i passaggi indicati di seguito:
- Carica un documento HTML utilizzando la classe HTMLDocument.
- Chiama il metodo QuerySelectorAll(). Prende il selettore di query come argomento.
- Infine, scorrere l’elenco di elementi risultante.
L’esempio di codice seguente mostra come estrarre contenuto HTML usando i selettori CSS in C#.
// Inizializzare un documento in base al codice preparato
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");
// Qui creiamo un selettore CSS che estrae tutti gli elementi div
var elements = document.QuerySelectorAll("div");
// Iterare sull'elenco di elementi risultante
foreach (Aspose.Html.HTMLElement element in elements)
{
System.Console.WriteLine(element.InnerHTML);
}
Ottieni una licenza gratuita
Prova l’API senza limitazioni di valutazione richiedendo una licenza temporanea gratuita.
Conclusione
In questo articolo abbiamo imparato a:
- leggere ed estrarre il contenuto di un documento HTML utilizzando C#;
- ispeziona gli elementi del documento e trova un elemento specifico dall’HTML;
- dati specifici della query ed estrai i dati utilizzando CSS Selector.
Inoltre, puoi saperne di più su Aspose.HTML per .NET API usando la documentazione. In caso di ambiguità, non esitare a contattarci sul forum.