2015-10-05 45 views
0
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Net; 
using System.IO; 
using HtmlAgilityPack; 
using mshtml; 

namespace Extract_Images 
{ 
    public partial class Form1 : Form 
    { 
     private string[] linkstoextract; 
     private int numberoflinks; 
     private string mainlink; 
     private WebClient client; 
     private WebBrowser webBrowser1; 

     public Form1() 
     { 
      InitializeComponent(); 

      webBrowser1 = new WebBrowser(); 
      webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted; 


      label1.Text = "Number of links: "; 

      mainlink = "http://www.test.com/index"; 
      numberoflinks = 211; 
      for (int i = 0; i < numberoflinks; i++) 
      { 
       webBrowser1.Navigate(mainlink + i + ".html"); 
       GetHtmlFromUrl(mainlink + i + ".html"); 
      } 

     } 

     void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      throw new NotImplementedException(); 
     } 


     private void GetHtmlFromUrl(string url) 
     { 

      IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument; 
      IHTMLControlRange imgRange = (IHTMLControlRange)((HTMLBody)doc.body).createControlRange(); 

      foreach (IHTMLImgElement img in doc.images) 
      { 
       imgRange.add((IHTMLControlElement)img); 

       imgRange.execCommand("Copy", false, null); 

       using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap)) 
       { 
        bmp.Save(@"C:\" + img.nameProp); 
       } 
      } 

     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

问题是,现在我使用for循环来遍历每个链接并提取图像。如何确保在完成事件时使用webBrowser?

问题是,在它将从第一个链接提取所有图像之前,它将继续执行for循环,并已尝试浏览到下一个链接。

我需要以某种方式使用一段时间或其他东西,以确保它将浏览第一个链接将获得完成的事件,它将提取图像的所有链接,只有当它完成工作时提取所有图像第一个html然后保留在循环中的下一个。

接下来,我有所有页面的所有图像链接列表后,然后我想要下载所有的图像使用链接。但问题正如我上面所述。

回答

0

我对你的代码做了一些修改,但是只在文本编辑器中做了修改,所以我没有任何编译时检查或逻辑验证的好处 - 对不起。但希望我的建议代码能帮助你理清一种方法,让操作顺序按照你想要的方式行事。

public partial class Form1 : Form 
{ 
    private string[] linkstoextract; 
    private int numberoflinks; 
    private int currentLinkNumber = 0; 
    private string mainlink; 
    private WebClient client; 
    private WebBrowser webBrowser1; 

    public Form1() 
    { 
     InitializeComponent(); 

     webBrowser1 = new WebBrowser(); 
     webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted; 

     label1.Text = "Number of links: "; 

     mainlink = "http://www.test.com/index"; 
     numberoflinks = 211; 

     ProcessNextLink(); 
    } 

    private void ProcessNextLink() 
    { 
     if (currentLinkNumber < numberoflinks) 
     { 
      currentLinkNumber++; 
      webBrowser1.Navigate(mainlink + currentLinkNumber.ToString() + ".html"); 
     } 
    } 

    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     ProcessImagesFromDocument(); 
     ProcessNextLink(); 
    } 

    private void ProcessImagesFromDocument() 
    { 
     IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument; 
     IHTMLControlRange imgRange = (IHTMLControlRange)((HTMLBody)doc.body).createControlRange(); 

     foreach (IHTMLImgElement img in doc.images) 
     { 
      imgRange.add((IHTMLControlElement)img); 
      imgRange.execCommand("Copy", false, null); 

      using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap)) 
      { 
       bmp.Save(@"C:\" + img.nameProp); 
      } 
     } 

    } 

} 

总结建议的更改:

  • 我创建了一个变量currentLinkNumber作用域到跟踪正在处理当前的“链接”的形式 - 这是作为同一角色您的变量i其作用域只对for循环
  • 我感动的Navigate和变量,以自己的方式递增,这样我们就可以有从DocumentCompleted调用一个方法后,它已经完全完成下载处理当前链接
  • 我改名为你GetHtmlFromUrl方法ProcessImagesFromDocument因为此时不需要url参数,我也感动了呼叫到DocumentCompleted

希望有所帮助。

+0

问题是,在ProcessImagesFromDocument()方法后它永远不会继续。我使用了一个断点,并且在foreach之后能够停止。它只是没有做任何事情,我看到form1的形式,这没什么。不知道为什么它不会继续。 –

相关问题