Sto cercando di ottenere un elenco di immagini dal sito Web e di salvarle sul disco rigido, ma non funziona

c# html-agility-pack

Domanda

Sto usando HtmlAgilityPack.

In questa funzione i imageNodes nel conteggio foreach sono 0

Non capisco perché il numero delle liste sia 0

Il sito Web contiene molte immagini. Quello che voglio è ottenere un elenco delle immagini dal sito e mostrare l'elenco nel richTextBox1 e voglio anche salvare tutte le immagini dal sito sul mio disco rigido.

Come posso ripararlo?

public void GetAllImages()
{
   // Bing Image Result for Cat, First Page
   string url = "http://www.bing.com/images/search?q=cat&go=&form=QB&qs=n";

   // For speed of dev, I use a WebClient
   WebClient client = new WebClient();
   string html = client.DownloadString(url);

   // Load the Html into the agility pack
   HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
   doc.LoadHtml(html);

   // Now, using LINQ to get all Images
   List<HtmlNode> imageNodes = null;
   imageNodes = (from HtmlNode node in doc.DocumentNode.SelectNodes("//img")
                 where node.Name == "img"
                    && node.Attributes["class"] != null
                    && node.Attributes["class"].Value.StartsWith("img_")
                 select node).ToList();

   foreach (HtmlNode node in imageNodes)
   {
      // Console.WriteLine(node.Attributes["src"].Value);
      richTextBox1.Text += node.Attributes["src"].Value + Environment.NewLine;
   }
}

Risposta accettata

Come posso vedere la classe corretta delle immagini di Bing è sg_t . È possibile ottenere quegli HtmlNodes con la seguente query Linq:

List<HtmlNode> imageNodes = doc.DocumentNode.Descendants("img")
    .Where(n=> n.Attributes["class"] != null && n.Attributes["class"].Value == "sg_t")
    .ToList();

Questo elenco dovrebbe essere riempito con tutte le img con class = 'sg_t'


Risposta popolare

Un rapido sguardo alla pagina / URL di esempio nel tuo codice mostra che le immagini che stai cercando non hanno un tipo di classe che inizia con "img_".

<img class="sg_t" src="http://ts2.mm.bing.net/images/thumbnail.aspx?q=4588327016989297&amp;id=db87e23954c9a0360784c0546cd1919c&amp;url=http%3a%2f%2factnowtraining.files.wordpress.com%2f2012%2f02%2fcat.jpg" style="height:133px;top:2px">

Ho notato che il tuo codice sta mirando solo ai thumnails. Vuoi anche l'URL dell'immagine a dimensione intera, che si trova nell'ancora che circonda ogni miniatura. Dovrai estrarre l'URL finale da un href simile a questo:

<img class="sg_t" src="http://ts2.mm.bing.net/images/thumbnail.aspx?q=4588327016989297&amp;id=db87e23954c9a0360784c0546cd1919c&amp;url=http%3a%2f%2factnowtraining.files.wordpress.com%2f2012%2f02%2fcat.jpg" style="height:133px;top:2px">

e decodifica il bit che assomiglia a: url=http%3a%2f%2factnowtraining.files.wordpress.com%2f2012%2f02%2fcat.jpg

che decodifica in: http://actnowtraining.files.wordpress.com/2012/02/cat.jpg




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché