2011-01-29 15 views
7

Voglio usare il pacchetto agility HTML per analizzare i collegamenti immagine e href da una pagina HTML, ma non so molto di XML o XPath. Anche se ho cercato documenti di aiuto in molti siti web, non posso proprio risolvo il problema.Inoltre, io uso C# in VisualStudio 2005. E non riesco a parlare inglese correntemente, quindi, darò i miei sinceri ringraziamenti a chi può scrivere alcuni codici utili.Come ottenere img/src o a/hrefs utilizzando Html Agility Pack?

+0

E, Html Agility Pack può risolvere i percorsi relativi? – iShow

risposta

21

La first example sulla home page fa qualcosa di molto simile, ma prendere in considerazione:

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 
} 

Così si può immaginare che per img src @, basta sostituire ogni a con img, e href con src. Si potrebbe anche essere in grado di semplificare a:

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

Per una manipolazione URL relativo, guardate la classe Uri.

+0

ringrazio molto e questa è la mia prima esperienza chiedendo – iShow

+0

+1 @ Marc ... eccezionale ... Questo è esattamente quello che sto cercando ... –

+3

ottengo l'errore:! DocumentElement non esiste in oggetto HtmlDocument per 1,4. 0.0 versione HtmlAgilityPack foreach (link HtmlNode a doc.DocumentNode.SelectNodes ("// un [@href]")) { HtmlAttribute att = link.Attributes [ "href"]; – Kiquenet

6

L'esempio e la risposta accettata sono errati. Non viene compilato con l'ultima versione. Provo qualcos'altro:

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(); 
    } 

Questo funziona per me.

1

Forse sono qui troppo tardi per pubblicare una risposta. Quanto segue ha funzionato per me:

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