Come ottenere gli URL sulla pagina con HTMLAgilityPack, quando l'origine non contiene gli URL?

c# html html-agility-pack

Domanda

Sto cercando di raschiare gli URL KB da questa pagina: https://support.microsoft.com/en-us/kb/894199

Nella pagina sono presenti URL come: https://support.microsoft.com/kb/2976978

Se apri gli strumenti per sviluppatori in Chrome, mostra che i dati sono contenuti in questo modo:

<div class="indent">
<a id="kb-link-142" href="https://support.microsoft.com/kb/2976978" target="_self">https://support.microsoft.com/kb/2976978</a>
</div>

Ora basato sull'HTML di cui sopra, credo che dovrei essere in grado di grattare gli URL dall'elemento href in questo modo:

foreach(HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
   list.Add(link.GetAttributeValue("href", string.Empty));
}

Il problema che sto incontrando è che quando scarico HTMLSource, il contenuto cambia. Ciò che intendo è che anche se gli strumenti per sviluppatori mostrano l'HTML sopra riportato disponibile sulla pagina, se fai clic con il tasto destro sulla pagina e scegli Visualizza sorgente, il codice HTML visualizzato a quel punto è completamente diverso e non contiene nessuno degli URL che viene visualizzata la pagina visualizzata.

La mia teoria è che esiste una sorta di riferimento di file in cui l'HTML carica un file da qualche parte e il file contiene i dettagli della pagina che viene renderizzata. Quindi, come posso utilizzare HTMLAgilityPack per ottenere gli URL presenti nella pagina di rendering, poiché la sorgente non sembra contenerli?

Inoltre, mi rendo conto che la mia domanda potrebbe essere davvero confusa. Se c'è un termine tecnico per ciò che questa pagina sta facendo / come funziona, fammi sapere e posso aggiornare il titolo in modo che sia più logico e altri possano cercarlo in futuro.

Risposta popolare

Ok, vedo il problema ora. Questa pagina utilizza le direttive e i binding di Angularjs e gli hrefs caricano il caricamento della pagina. La pagina che stiamo ottenendo è prima che qualsiasi parsing / esecuzione si sia verificata dall'agente del browser web. Ciò significa che le modifiche alla pagina dopo ogni manupulation DOM / javascript o modifica ajax non saranno incluse nella risposta HtmlDocument. Penso che il modo di procedere sarebbe fingere come una richiesta del browser Web, lasciare che javascript e ajax vengano eseguiti completamente e recuperati come consigliato qui . Spero che questo ti aiuti!



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché