2010-05-20 22 views
12

Estoy tratando de usar el HtmlAgilityPack para extraer todos los enlaces de una página que están dentro de un div declarado como <div class='content'> Sin embargo, cuando uso el código siguiente simplemente obtengo TODO enlaces en toda la página. Esto realmente no tiene sentido para mí ya que estoy llamando a SelectNodes desde el subnodo que seleccioné anteriormente (que cuando se ve en el depurador solo muestra el HTML de ese div específico). Por lo tanto, es como si volviera al nodo raíz cada vez que llamo a SelectNodes. El código que uso está a continuación:Seleccionar solo elementos en un DIV específico utilizando 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); 
} 

¿Es este el comportamiento esperado? Y si es así, ¿cómo hago que haga lo que estoy esperando?

Respuesta

18

Esto funcionará:

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

Además, puede hacerlo en un solo selector:

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

Además, tenga en cuenta que link.Value no está definido para HtmlNode, por lo que su código doesn' t compilar.

+0

Esto no parece correcto con el XPath que conozco, pero funciona. También confieso que utilicé HtmlAgilityPack por primera vez en este momento para responder la pregunta. No puedo encontrar ninguna documentación ... – Kobi

+1

con respecto al enlace. Valor, estaba reescribiendo esto de memoria ... era prob InnerHtml o algo así. Entonces, ¿el // hace que siempre vuelva a la raíz? No obtuve esa impresión de la documentación de XPath en W3C –

+0

. Es bastante impresionante de memoria ... De todos modos, tienes razón, XPath comienza con '// 'debe respetar su contexto, hasta donde yo sé. – Kobi

Cuestiones relacionadas