2011-01-29 65 views
7

Quiero usar el paquete de agilidad HTML para analizar los enlaces de imagen y href desde una página HTML, pero simplemente no sé mucho sobre XML o XPath. Aunque busqué documentos de ayuda en muchos sitios web, simplemente no puedo resuelva el problema. Además, uso C# en VisualStudio 2005. Y no puedo hablar inglés con fluidez, por lo tanto, le agradezco sinceramente que uno pueda escribir algunos códigos útiles.¿Cómo obtener img/src o a/hrefs usando Html Agility Pack?

+0

Y, ¿puede Html Agility Pack resolver rutas relativas? – iShow

Respuesta

21

El first example en la página principal hace algo muy similar, pero tener en cuenta:

HtmlDocument doc = new HtmlDocument(); 
doc.Load("file.htm"); // would need doc.LoadHtml(htmlSource) if it is not a file 
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"]) 
{ 
    string href = link["href"].Value; 
    // store href somewhere 
} 

Así se puede imaginar que para img src @, basta con sustituir cada a con img y href con src. Usted podría incluso ser capaz de simplificar a:

foreach(HtmlNode node in doc.DocumentElement 
       .SelectNodes("//a/@href | //img/@src") 
{ 
    list.Add(node.Value); 
} 

Para manipulación URL relativa, mirar a la clase Uri.

+0

Muchas gracias! Y esta es mi primera experiencia – iShow

+0

+1 @Marc ... Sobresaliente ... Esto es exactamente lo que estoy buscando ... –

+3

Aparece el error: DocumentElement no existe en el objeto HtmlDocument para 1.4. 0.0 versión HtmlAgilitypack foreach (enlace HtmlNode en doc.DocumentNode.SelectNodes ("// a [@href]")) { HtmlAttribute att = link.Attributes ["href"]; – Kiquenet

6

El ejemplo y la respuesta aceptada es incorrecta. No compila con la última versión. Intento algo más:

private List<string> ParseLinks(string html) 
    { 
     var doc = new HtmlDocument(); 
     doc.LoadHtml(html); 
     var nodes = doc.DocumentNode.SelectNodes("//a[@href]"); 
     return nodes == null ? new List<string>() : nodes.ToList().ConvertAll(
       r => r.Attributes.ToList().ConvertAll(
       i => i.Value)).SelectMany(j => j).ToList(); 
    } 

Esto funciona para mí.

1

Quizás estoy demasiado tarde aquí para publicar una respuesta. Lo siguiente funcionó para mí:

var MainImageString = MainImageNode.Attributes.Where(i=> i.Name=="src").FirstOrDefault(); 
Cuestiones relacionadas