Web scraping con C#

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#

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:

  1. Carica un documento HTML utilizzando la classe HTMLDocument.
  2. 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);
Leggi ed estrai HTML usando C#.

Leggi ed estrai HTML usando C#.

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:

  1. Carica un documento HTML utilizzando la classe HTMLDocument.
  2. Ottieni l’elemento HTML del documento.
  3. Ottieni il primo/ultimo elemento dell’elemento HTML.
  4. 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:

  1. Definire i filtri utilizzando la classe NodeFilter e sovrascrivere il metodo AcceptNode().
  2. Carica un documento HTML utilizzando la classe HTMLDocument.
  3. 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:

  1. Carica un documento HTML utilizzando la classe HTMLDocument.
  2. Chiama il metodo Evaluate(). Prende la stringa dell’espressione XPath, il documento e il tipo come argomenti.
  3. 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:

  1. Carica un documento HTML utilizzando la classe HTMLDocument.
  2. Chiama il metodo QuerySelectorAll(). Prende il selettore di query come argomento.
  3. 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.

Guarda anche