2012-06-15 3 views
1

Я пытаюсь пройти через исходный код веб-страниц, добавьте <img src="http://www.dot.com/image.jpg" в HtmlElementCollection. Затем я пытаюсь выполнить цикл через каждый элемент коллекции элементов с помощью цикла foreach и загрузить изображения через URL-адрес.Изображение скребок с C#

Вот что у меня есть. Моя проблема прямо сейчас не загружается, и я не думаю, что мои элементы добавляются должным образом по имени тега. Если они есть, я не могу ссылаться на них для загрузки.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void button1_Click(object sender, EventArgs e) 
    { 
     string url = urlTextBox.Text; 
     string sourceCode = WorkerClass.ScreenScrape(url); 
     StreamWriter sw = new StreamWriter("sourceScraped.html"); 
     sw.Write(sourceCode); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     string url = urlTextBox.Text; 
     WebBrowser browser = new WebBrowser(); 
     browser.Navigate(url); 
     HtmlElementCollection collection; 
     List<HtmlElement> imgListString = new List<HtmlElement>(); 
     if (browser != null) 
     { 
      if (browser.Document != null) 
      { 
       collection = browser.Document.GetElementsByTagName("img"); 
       if (collection != null) 
       { 
        foreach (HtmlElement element in collection) 
        { 
         WebClient wClient = new WebClient(); 
         string urlDownload = element.FirstChild.GetAttribute("src"); 
         wClient.DownloadFile(urlDownload, urlDownload.Substring(urlDownload.LastIndexOf('/'))); 
        } 
       } 
      } 
     } 
    } 
} 

}

+0

Вы пытаетесь пройти через веб-страницу и добавить ... что? –

+0

Проверьте значение urlDownload для допустимого пути. – jac

ответ

2

Вы вызываете навигацию, вы предполагаете, что документ готов к обходу и проверке изображений. но практически требуется некоторое время для загрузки. Вам нужно дождаться завершения загрузки документа.

Добавить событие DocumentCompleted к объекту

browser.DocumentCompleted += browser_DocumentCompleted; 

браузера реализовать его как

static void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    WebBrowser browser = (WebBrowser)sender; 
    HtmlElementCollection collection; 
    List<HtmlElement> imgListString = new List<HtmlElement>(); 
    if (browser != null) 
    { 
     if (browser.Document != null) 
     { 
      collection = browser.Document.GetElementsByTagName("img"); 
      if (collection != null) 
      { 
       foreach (HtmlElement element in collection) 
       { 
        WebClient wClient = new WebClient(); 
        string urlDownload = element.GetAttribute("src"); 
        wClient.DownloadFile(urlDownload, urlDownload.Substring(urlDownload.LastIndexOf('/'))); 
       } 
      } 
     } 
    } 
} 
+0

Это именно то, что я сделал. Это сработало. Я как раз собирался опубликовать свой собственный ответ! лол. – Keith

+0

Рад это услышать. Примите один ответ или вы можете опубликовать свой собственный ответ и принять его как ответ, если что-то другое. – Damith

+0

Извините. Я не заметил, что есть место, где можно принять ответ. Я здесь новенький. – Keith

0

Посмотрите на Html Agility Pack.

Что нужно сделать, это загрузить и проанализировать HTML-код, а затем обработать элементы, которые вас интересуют. Это хороший инструмент для таких задач.

0

Для тех, кто заинтересован, здесь было решение. Это то, что сказал Дамит. Я обнаружил, что Html Agility Pack довольно сломан. Это было первое, что я пытался использовать. Это оказалось более жизнеспособным решением для меня, и это мой последний код.

private void button2_Click(object sender, EventArgs e) 
    { 
     string url = urlTextBox.Text; 
     WebBrowser browser = new WebBrowser(); 
     browser.Navigate(url); 
     browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DownloadFiles); 
    } 

    private void DownloadFiles(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 

     HtmlElementCollection collection; 
     List<HtmlElement> imgListString = new List<HtmlElement>(); 

     if (browser != null) 
     { 
      if (browser.Document != null) 
      { 
       collection = browser.Document.GetElementsByTagName("img"); 
       if (collection != null) 
       { 
        foreach (HtmlElement element in collection) 
        { 
         string urlDownload = element.GetAttribute("src"); 
         if (urlDownload != null && urlDownload.Length != 0) 
         { 
          WebClient wClient = new WebClient(); 
          wClient.DownloadFile(urlDownload, "C:\\users\\folder\\location\\" + urlDownload.Substring(urlDownload.LastIndexOf('/'))); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

}