Come posso accedere al contenuto di più
tag con HTMLAgilityPack?

c# html html-agility-pack wpf

Domanda

Non riesco a trovare la documentazione per HTMLAgilityPack sul sito Web di codeplex. Attualmente ciò che voglio fare è accedere a un div sul sito web di Amazon e raschiare informazioni di testo da utilizzare in un'applicazione WPF.

var getWeb = new HtmlWeb();                     
var doc = getWeb.Load(uri);
HtmlNode ourNode = doc.DocumentNode.SelectSingleNode("//div[@id = 'zg_centerListWrapper']");

Questo div contiene circa 12 altri div, ognuno è un articolo nella categoria dei best sellers .

Per accedere alle proprietà di ciascuno sembrerebbe essere meticoloso (e non sono nemmeno del tutto sicuro di come lo farei a prima vista). Quindi dovrei usare invece DocumentNode.SelectNodes() ? E come lo implementerei? Anche io trovo difficile credere che dopo un po 'di tempo non ci sia documentazione per HTMLAgilityPack ... Forse sto cercando nei posti sbagliati perché su YouTube sembra essere la mia migliore fonte al momento.

Risposta accettata

In realtà, i parametri di SelectNodes() e SelectSingleNode() sono un'espressione xpath, xpath versione 1.0 per essere precisi (vedere le specifiche xpath 1.0 qui ).

XPath è un'altra tecnologia con specifiche, documentazione e discussioni proprie. Generalmente è possibile cercare esercitazioni o articoli xpath invece di specifiche HtmlAgilityPack (HAP), per avere un'idea migliore di quale tipo di espressione si dovrebbe passare a HAP per ottenere particolari elementi HTML.

Per fare un esempio, supponiamo che il tuo HTML assomigli a questo:

<div id="zg_centerListWrapper">
    <div>I want this</div>
    <div>..and this</div>
    <div>..and this one too</div>
</div>

vedi che le div che ti interessano sono figli diretti del div[@id = 'zg_centerListWrapper'] , quindi puoi usare il seguente xpath per ottenerle:

var xpath = "//div[@id = 'zg_centerListWrapper']/div";
HtmlNodeCollection ourNodes = doc.DocumentNode.SelectNodes(xpath);

Risposta popolare

È possibile utilizzare DocumentNode.Descendants("div") e quindi qualcosa di simile

.Where(div => div.Attributes.Contains("class") && div.Attributes["class"].Value.Contains("best category"))

Ma sì, la documentazione sarebbe certamente di aiuto ..



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é