2011-10-18 12 views
0

いくつかのHTMLを解析する簡単な試みでかなりの問題が発生しているようです。練習としては、クロールするサイトのリストで始まるマルチスレッドのWebクローラを作成しています。これはいくつかのクラスを通して伝えられ、最終的にはサイトのコンテンツを私のシステムに戻すべきです。C#Web解析の競合

A. Webサイトのコンテンツ(HttpWebRequestストリームからの文字列形式)をHtmlDocumentに変換します(新しいインスタンスを作成できません)。これは簡単ですが、 HtmlDocument.Write()メソッドを使用することで、HtmlDocumentの意味が分かりません)。

又は

B.は、WebBrowserインスタンスを介してのHTMLDocumentを収集します。ここで

は、このコードは、それが「移動」メソッド上を通過する際に何もしないように思わ

public void Start() 
    { 
     if (this.RunningThread == null) 
     { 
      Console.WriteLine("Executing SiteCrawler for " + SiteRoot.DnsSafeHost); 

      this.RunningThread = new Thread(this.Start); 
      this.RunningThread.SetApartmentState(ApartmentState.STA); 
      this.RunningThread.Start(); 
     } 
     else 
     { 
      try 
      { 
       WebBrowser BrowserEmulator = new WebBrowser(); 
       BrowserEmulator.Navigate(this.SiteRoot); 

       HtmlElementCollection LinkCollection = BrowserEmulator.Document.GetElementsByTagName("a"); 
       List<PageCrawler> PageCrawlerList = new List<PageCrawler>(); 

       foreach (HtmlElement Link in LinkCollection) 
       { 
        PageCrawlerList.Add(new PageCrawler(Link.GetAttribute("href"), true)); 
        continue; 
       } 
       return; 
      } 
      catch (Exception e) 
      { 
       throw new Exception("Exception encountered in SiteCrawler: " + e.Message); 
      } 
     } 
    } 

...何かアドバイスは素晴らしいことだ、それが存在するように私のコードです。 IEの新しいインスタンスをポップアップして指定されたアドレスに移動するが、navigateメソッドのプログラムステップの前に移動するのではなく、新しいウィンドウで開くようにしようとした。私はブラウザが「忙しくない」のを待ってみましたが、とにかくビジー属性を拾うようなことはありません。私はWebRequestストリームからデータを取り込むことができるように、Browser.Document.OpenNew()を介して新しいドキュメントを作成しようとしましたが、私が到達しようとするとNull Pointer例外を返すと確信できますそのステートメントの 'Document'部分。私はいくつかの研究を行っており、これは新しいHtmlDocumentを作成する唯一の方法であるようです。

このように、このメソッドは、指定されたページのすべてのリンクについて「PageCrawler」を開始することを意図しています。 HttpWebRequestを使ってストリームからデータを収集した後、すべてのリンクを見つけるために文字単位でHTML文字を解析できると確信していますが、これはこれを完了するために必要な作業よりはるかに多くの作業です。

誰かがアドバイスをいただければ、大変感謝します。ありがとうございました。

+0

http://www.codedblog.com/2007/08/29/google-web-toolkit-and-c/ –

+0

を使用することを検討してください。あなたのコードをテストしようとしたとき、私は 'this.RunningThread' this.SiteRoot'' PageCrawler'など。あなたは本当の答えではないと思います。 –

答えて

1

コンソールアプリケーションの場合、コンソールアプリケーションにメッセージポンプ(メッセージを処理するにはWebBrowserが必要)がないため、コンソールアプリケーションでは機能しません。場合

private void OnDocCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    WebBrowser wb = sender as WebBrowser; 

    if (wb.Document != null) 
    { 
     List<string> links = new List<string>(); 

     foreach (HtmlElement element in wb.Document.GetElementsByTagName("a")) 
     { 
      links.Add(element.GetAttribute("href")); 
     } 

     foreach (string link in links) 
     { 
      Console.WriteLine(link); 
     } 
    } 
} 

:イベントを処理するメソッドを実装して次に

WebBrowser browserEmulator = new WebBrowser(); 
browserEmulator.DocumentCompleted += OnDocumentCompleted; 
browserEmulator.Navigate(this.SiteRoot); 

は、Windowsでこれを実行する場合は、アプリケーションを形成し、その後、あなたはDocumentCompletedイベントを処理する必要がありますこれをコンソールアプリケーションで実行したい場合は、別の方法でページをダウンロードする必要があります。 WebRequest/WebResponseを使用し、次にHtmlAgilityPackを使用してHTMLを解析することをお勧めします。 HtmlAgilityPackHtmlDocumentを生成し、そこからリンクを得ることができます。あなたは、スケーラブルなウェブクローラの構築についての詳細を学ぶことに興味があるなら


さらに、次のリンクをチェックアウト:

幸運を!

+0

正直な人、助けてくれてありがとう、私はアジリティのパックを手に入れなければならない、私はちょうど2つの場所に私の履歴書で送るためにコードサンプルをまとめようとしている、クローラーはかなり簡単なようだったすべてが包括的なソリューションです。 – DigitalJedi805

+0

@ DigitalJedi805答えに満足すれば、答えの横にあるチェックマークをオフにして勝者を授与してください。ありがとうございました! :) – Kiril