2010-05-20 13 views
12

Sto provando a utilizzare HtmlAgilityPack per richiamare tutti i collegamenti da una pagina contenuti in un div dichiarato come <div class='content'> Tuttavia, quando utilizzo il codice riportato di seguito, ottengo semplicemente TUTTI collegamenti su tutta la pagina. Questo non ha senso per me dal momento che sto chiamando SelectNodes dal sub-nodo che ho selezionato in precedenza (che quando visualizzato nel debugger mostra solo l'HTML da quel div specifico). Quindi, è come se tornasse al nodo root ogni volta che chiamo SelectNodes. Il codice che uso è qui sotto:Selezionare solo gli elementi in un DIV specifico utilizzando HtmlAgilityPack

HtmlWeb hw = new HtmlWeb(); 
HtmlDocument doc = hw.Load(@"http://example.com"); 
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='content']"); 
foreach(HtmlNode link in node.SelectNodes("//a[@href]")) 
{ 
    Console.WriteLine(link.Value); 
} 

È questo il comportamento previsto? E se sì, come faccio a fare ciò che mi aspetto?

risposta

18

Ciò funzionerà:

node.SelectNodes("a[@href]") 

Inoltre, è possibile farlo in un unico selettore:

doc.DocumentNode.SelectSingleNode("//div[@class='content']//a[@href]") 

Si noti inoltre che link.Value non è definito per HtmlNode, così il vostro codice di doesn' t compilare.

+0

Questo non sembra corretto con XPath, lo so, ma funziona. Vorrei anche confessare che ho usato HtmlAgilityPack per la prima volta proprio ora, per rispondere alla domanda. Non riesco a trovare alcuna documentazione ... – Kobi

+1

per quanto riguarda link.Value, stavo riscrivendo questo dalla memoria ... era prob InnerHtml o qualcosa del genere. Quindi è il // che fa tornare sempre alla radice? Non ho avuto questa impressione dalla documentazione XPath su W3C –

+0

T hat è piuttosto impressionante dalla memoria ... Ad ogni modo, hai ragione - XPath che inizia con '// 'dovrebbe rispettare il suo contesto, per quanto ne so. – Kobi

Problemi correlati