1

<img src="http://www.dot.com/image.jpg"Webページのソースコードを調べて、をに追加しようとしていHtmlElementCollectionます。次に、foreachループを使用して要素コレクション内の各要素を循環させ、URLを介して画像をダウンロードしようとしています。

これが私がこれまでに持っているものです。今の私の問題は何もダウンロードされていないことです、そして私の要素がタグ名によって適切に追加されているとは思いません。もしそうなら、私はダウンロードのためにそれらを参照することができないようです。

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

}

4

3 に答える 3

3

ナビゲートと呼ぶものは、ドキュメントがトラバースして画像をチェックする準備ができていると想定しています。ただし、実際にはロードには時間がかかります。ドキュメントの読み込みが完了するまで待つ必要があります。

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('/')));
                }
            }
        }
    }
}
于 2012-06-15T04:31:33.927 に答える
0

HtmlAgilityPackをご覧ください。

HTMLをダウンロードして解析し、関心のある要素を処理する必要があります。これは、このようなタスクに適したツールです。

于 2012-06-15T04:13:44.170 に答える
0

興味のある人には、ここに解決策があります。それはまさにダミスが言ったことです。HtmlAgilityPackがかなり壊れていることがわかりました。それが私が最初に使ってみたものでした。これは私にとってより実行可能な解決策であり、これが私の最終的なコードです。

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

}

于 2012-06-15T19:13:34.357 に答える