2009-05-13 9 views
35

Estoy intentando usar la biblioteca HtmlAgilityPack para analizar algunos enlaces en una página, pero no veo los resultados que esperaría de los métodos. A continuación, tengo una HtmlNodeCollection de enlaces. Para cada enlace, quiero verificar si hay un nodo de imagen y luego analizar sus attribures, pero los métodos SelectNodes y SelectSingleNode de linkNode parecen estar buscando en el documento padre, no en los childNodes de linkNode, ¿qué ofrece?HtmlAgilityPack seleccionando childNodes no como se esperaba

HtmlDocument htmldoc = new HtmlDocument(); 
htmldoc.LoadHtml(content); 
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]"); 

foreach(HtmlNode linkNode in linkNodes) 
{ 
    string linkTitle = linkNode.GetAttributeValue("title", string.Empty); 
    if (linkTitle == string.Empty) 
    { 
     HtmlNode imageNode = linkNode.SelectSingleNode("/img[@alt]");  
    } 
} 

¿Hay alguna otra manera de que pudiera obtener el atributo alt de la imagen del childNode linkNode si es que existe?

Respuesta

37

Debe eliminar el prefijo de reenvío de "/ img [@alt]", ya que significa que desea comenzar en la raíz del documento.

HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]"); 
+1

Errrm OK. Eso fue bastante tonto de mi parte. Pensé que me estaba perdiendo algo. Perdón por perder espacio de preguntas Gracias. – Sheff

+3

Siempre hay mucho espacio :) –

+1

¡Eres el hombre! Hace un momento estaba maldiciendo al proyecto HtmlAgility, pero resulta que simplemente implementaron xpath de la manera correcta :) – Moulde

10

Además, tenga cuidado con Null Check. SelectNodes devuelve null en lugar de colección en blanco.

HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]"); 

**if(linkNodes!=null)** 
{ 
    foreach(HtmlNode linkNode in linkNodes) 
    { 
    string linkTitle = linkNode.GetAttributeValue("title", string.Empty); 
    if (linkTitle == string.Empty) 
    { 
     **HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");** 
    } 
    } 
} 
+4

que fue una decisión de diseño realmente estúpida IMO. No hay ninguna razón por la que * no deba * devolver una colección vacía. – mpen

+0

ver también http://stackoverflow.com/questions/8619724/htmlagilitypack-documentnode-selectnodes-returns-null-shouldnt –

38

Con una consulta de xpath también puede utilizar "." para indicar que la búsqueda debe comenzar en el nodo actual.

HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]"); 
+0

El eje predeterminado es 'children' para un prefijo que en realidad no es necesario en absoluto. –

+1

Esta debería ser la respuesta aceptada. –

Cuestiones relacionadas