2012-02-28 7 views
2

Webハーベスティング、Webデータ抽出、スクリーンスクレーピングなどのC#でMicrosoft .NETアプリケーションを開発中です。あなたがそれを呼びたいと思っているものは何でも。 HTMLを解析するために、私はHTML Agility Packを組み込もうとしていますが、思ったほど簡単ではありません。私はこれまでに何を持っていたのかに関するいくつかの仕様とイメージを含め、どのように進むことができるかについてあなたの意見を得たいと考えていました。基本的に、私はVisual Web Ripperで使用されているレイアウトに似たようなことをしたいのですが、どうやってそれをやっているのかわかりません。C#と.NET Frameworkを使用したスクリーンスクレーピング、Webスクレーピング、Webハーベスティング、Webデータ抽出など

画像:

http://img69.imageshack.us/img69/8880/webharvester1.png

http://img198.imageshack.us/img198/9563/webharvester2.png

仕様:

私の目標は、データや画像をダウンロードするための非常にユーザーフレンドリーポイント・アンド・クリックのアプリケーションを作ることですウェブから。私は、Webブラウザを使用してHTMLページを読み込み、解析されたデータと画像リンクをテキストボックスに出力したいと思います。ユーザーは、必要なHTMLタグを指定し、データをグリッドにダウンロードすることができます。最後に、データを必要な形式にエクスポートします。

私はHTMLアジリティパックを使用して、Webページ上のHTMLを読み込み、テキストボックスに表示しようとしています。

// Load Web Browser 
    private void Form6_Load(object sender, EventArgs e) 
    { 
     // Navigate to webpage 
     webBrowser.Navigate("http://www.webopedia.com/TERM/H/HTML.html"); 

     // Save URL to memory 
     SiteMemoryArray[count] = urlTextBox.Text; 

     // Load HTML from webBrowser 
     HtmlWindow window = webBrowser.Document.Window; 
     string str = window.Document.Body.OuterHtml; 

     // Extract tags using HtmlAgilityPack and display in textbox 
     HtmlAgilityPack.HtmlDocument HtmlDoc = new HtmlAgilityPack.HtmlDocument(); 
     HtmlDoc.LoadHtml(str); 

     HtmlAgilityPack.HtmlNodeCollection Nodes = HtmlDoc.DocumentNode.SelectNodes("//a"); 

     foreach (HtmlAgilityPack.HtmlNode Node in Nodes) 
     { 
      textBox2.Text += Node.OuterHtml + "\r\n"; 
     } 

    } 

の場合:HtmlWindow window = webBrowser.Document.Window;

私はエラーを取得する:オブジェクト参照がオブジェクトインスタンスに設定されていません。

+0

これは非常にきれいなスクリーンショットです。どのGUIライブラリを使用していますか? –

+0

ありがとうございます。それはDotNetBarとeXpressAppフレームワークです。何か案は? – John

+0

TBH、より具体的な質問が必要です。 http://stackoverflow.com/faqおよびhttp://stackoverflow.com/questions/how-to-askを参照してください。 –

答えて

3

としてWinAPIのを使用して画面を「読む」ことができます。ナビゲーションが完了したら、ブラウザコントロールがナビゲーション完了イベントを発生させるようにすることができます。これはSO例えばお答えください:C# how to wait for a webpage to finish loading before continuing

+0

私はそれをやろう... – John

2

私はHTMLAgilityPackに精通していませんが、私が過去に使用したコンポーネントの1つはSGMLReaderhttp://developer.mindtouch.com/SgmlReaderです。これはXMLReaderのドロップイン置換のように機能し、必要に応じて文書をXMLに変換します。 XMLDocument(またはさらにXDocument)に読み込むことができます。次に、あなたがそれを行うことはあなた次第です。

私はHTTPWebRequestを使用してHTMLを取得し、このコンポーネントにHTMLを読み込むことをお勧めします。あなたはWebBrowserコントロールの近くのどこに行く必要はありません。

+0

ありがとうございます。商用Web Scrappingソフトウェアのほとんどは、Webブラウザの要素をクリックして、どのタグを希望するかを選択することができます。私はこれをやろうとするのに苦労しています... http://img714.imageshack.us/img714/2756/visualwebripper.png – John

2

スクリーンスクレイピングの場合、特定の画像/シェイプを検索する場合は、http://www.emgu.com/wiki/index.php/Main_Pageを使用できます。 便利な場合があります。

また、あなたはあなたがブラウザのウィンドウを参照しているとき、完成したページの負荷を持っていない可能性があり、このような

private Bitmap Capture(IntPtr hwnd) 
    { 
     return Capture(hwnd, GetClientRectangle()); 
    } 

    private Bitmap Capture(IntPtr hwnd, Rectangle zone) 
    { 
     IntPtr hdcSrc = GetWindowDC(hwnd); 

     IntPtr hdcDest = CreateCompatibleDC(hdcSrc); 

     IntPtr hBitmap = CreateCompatibleBitmap(hdcSrc, zone.Width, zone.Height); 

     IntPtr hOld = SelectObject(hdcDest, hBitmap); 

     BitBlt(hdcDest, 0, 0, zone.Width, zone.Height, hdcSrc, zone.X, zone.Y, SRCCOPY); 


     SelectObject(hdcDest, hOld); 

     DeleteDC(hdcDest); 
     ReleaseDC(hwnd, hdcSrc); 

     Bitmap retBitmap = Bitmap.FromHbitmap(hBitmap); 

     DeleteObject(hBitmap); 
     return retBitmap; 
    } 
+0

.NET C#を使用したソースコードを含む完全なサンプル? – Kiquenet

1

タグ

IHTMLElementCollection AnchorColl = body.getElementsByTagName("a");//Html element's tag name 

のすべての要素を取得し、そのタグのすべての要素のAnchorCollを解析するには、HTML文書

using SHDocVw;//Interop.SHDocVw.dll 
using mshtml;//Microsoft.mshtml.dll 
InternetExplorer ie= new InternetExplorer(); 
ie.Navigate("www.example.com"); 
ie.Visible = true; 
Thread.Sleep(5000);//wait until page loads 
mshtml.HTMLDocument doc; 
doc = ie.Document;//gives the HTML document of the Page 

を解析します。

関連する問題