2010-01-21 5 views
16

Ich habe gerade das HTMLAgilityPack heruntergeladen und die Dokumentation hat keine Beispiele.Wie kann ich HTML Agility Pack verwenden, um alle Bilder von einer Website abzurufen?

Ich suche nach einer Möglichkeit, alle Bilder von einer Website herunterzuladen. Die Adresszeichenfolgen, nicht das physische Bild.

<img src="blabalbalbal.jpeg" /> 

Ich muss die Quelle jedes IMG-Tags ziehen. Ich möchte nur ein Gefühl für die Bibliothek und was sie bieten kann. Jeder sagte, dies sei das beste Werkzeug für den Job.

bearbeiten

public void GetAllImages() 
    { 
     WebClient x = new WebClient(); 
     string source = x.DownloadString(@"http://www.google.com"); 

     HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument(); 
     document.Load(source); 

         //I can't use the Descendants method. It doesn't appear. 
     var ImageURLS = document.desc 
        .Select(e => e.GetAttributeValue("src", null)) 
        .Where(s => !String.IsNullOrEmpty(s));   
    } 

Antwort

32

Sie können diese mithilfe von LINQ, wie folgt aus:

var document = new HtmlWeb().Load(url); 
var urls = document.DocumentNode.Descendants("img") 
           .Select(e => e.GetAttributeValue("src", null)) 
           .Where(s => !String.IsNullOrEmpty(s)); 

EDIT: Dieser Code jetzt tatsächlich funktioniert; Ich hatte vergessen zu schreiben document.DocumentNode.

+0

Welchen Objekttyp Dokument in Ihrem Beispiel? Ich kann die .Descendants-Methode nicht verwenden. Bitte überprüfe meine Bearbeitung. –

+0

Ich habe vergessen, ".DocumentNode" einzuschließen. – SLaks

+0

überprüfen Sie auch, dass Sie die neueste Beta verwenden, da die Linq-Funktionalität neu ist – rtpHarry

7

auf ihr ein Beispiel basiert, aber mit modifizierten XPath:

HtmlDocument doc = new HtmlDocument(); 
List<string> image_links = new List<string>(); 
doc.Load("file.htm"); 
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//img")) 
{ 
    image_links.Add(link.GetAttributeValue("src", "")); 
} 

ich diese Erweiterung nicht kennen, also bin ich nicht sicher, wie man woanders das Array zu schreiben, aber das wird bei Am wenigsten bekommen Sie Ihre Daten. (Ich definiere das Array auch nicht richtig, da bin ich mir sicher. Entschuldigung).

bearbeiten

mit Ihrem Beispiel:

public void GetAllImages() 
    { 
     WebClient x = new WebClient(); 
     string source = x.DownloadString(@"http://www.google.com"); 

     HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument(); 
     List<string> image_links = new List<string>(); 
     document.Load(source); 

     foreach(HtmlNode link in document.DocumentElement.SelectNodes("//img")) 
     { 
      image_links.Add(link.GetAttributeValue("src", "")); 
     } 


    } 
+0

Machen Sie das: 'Liste image_links = new Liste (); foreach (HtmlNode-Verknüpfung in doc.DocumentNode.SelectNodes ("// img")) { image_links.Add (link.GetAttributeValue ("src", "")); } ' – TaW

Verwandte Themen