単純なデータ(.NET HTMLパーサとESoupが当たる定期的な二つの方法を使用して)は、C#をクロール

データへの最初のアクセス

Xiangnongいくつかの名前の必要性のためにデータベース、ので、我々は360ライブラリは多くの名前を持っていた、百度に行ってきました

そして、それをコピーしようとしてコピーしないことが判明ように、あなたは、ログインする必要があります

この時点で、ソースコードを表示するにはF12をコピーすることができますが、コピーすることができても、挿入したいデータが非常に面倒です。複製はどこにもつながりませんので、私は知識の探求の精神を実施し、オープンのVisual Studioので、

まず、どのような戻り値を受け入れるためにバイト配列を使用し、その後、全ページ分のデータは、この時点で、あなたは、データを取得するためにWebクライアントオブジェクトを使用することができます取得する必要があります(HttpWebRequestの方法トラブルの少し)、および

パブリック静的 ボイドのGetData(列アドレス)
{ 
    WebクライアントWC = 新しいWebクライアント()。
    バイト [] htmlData = wc.DownloadData(アドレス)。
}

この時点では、StringオブジェクトをデコードhtmlDataオブジェクトに必要な、そして我々は、サイトのF12デコードモードを見て

復号し、符号化を使用してオブジェクトを復号化する必要性とのcharset = UTF-8、UTF-8を参照

文字列 HTML = Encoding.UTF8.GetString(htmlData)。

我々は値を持たない出力HTMLを見て

静的 ボイドメイン(文字列[]引数)
{ 
    // 枚以上アドレス 
    のGetData(" http://www.360doc.com/content/18/1010/13/642066_793541226.shtml " ); 
    Console.ReadKey(); 
} 

公共の 静的な 無効のGetData(文字列のアドレス)
{ 
    のWebClient WC = 新しい新しいWebクライアント();
     // 着信コールのアドレス
    バイト [] = HTMLData wc.DownloadData(アドレス); 

    文字列 HTML = Encoding.UTF8.GetString(HTMLData); 

    コンソール.WriteLine(HTML); 

}

出力:

二、正規表現のマッチ

そして、HTML文書の構造を初めて目を一致させる問題があります

それは、すべてのpタグを一致させる必要があり、その後、ライン上のコンテンツを取得します

最初に考えたのは一致する正規表現を使用することです:

パブリック 静的 ボイドのGetData(列アドレス)
{ 
    WebクライアントWC = 新しい新しいWebクライアント();
     // 着呼のアドレスとき
    バイト [] = HTMLData wc.DownloadData(アドレス); 

    文字列 HTML = Encoding.UTF8.GetString(HTMLData); 

    / / <PまたはP>非空白文字少なくとも100 <PまたはP>正規表現マッチング 
    、正規表現REG = 新しい新しい正規表現(" <【にpP]> \\ S 100 {、} </ [PPは]> " );
     // に一致するすべてのエントリを受け入れる 
    MatchCollection結果= reg.Matches(HTML);
     // ループ出力
    のforeach(マッチ項目結果)
    { 
        Console.WriteLineを(item.Value)。
    } 
}

同じ通話開始:

マッチ一致しているが、私たちに<p> </ p>タグも出一致しているので、それを改善するための正規表現、pタグの試合の内容を一致させるセットを使用すると、文字列を取ることはもちろん(析出します)。、正規表現を書く書き方を見て、「(一致したデータを分離したい)、」囲まれたデータマッチング括弧を分離することになるでしょうときには、次のとおりです。

正規表現REG = 新しい正規表現(" <【にpP]>(\\ S {100})</ [Ppを]> ");

あなたがデータを取得したい場合はその後、Matchオブジェクトのグループのプロパティを使用する必要がインデックスによってグループに試合を取得します:

パブリック 静的 ボイドのGetData(列アドレス)
{ 
    WebクライアントWC = 新しい新しいWebクライアント();
     // 着呼のアドレスとき
    バイト [] = HTMLData wc.DownloadData(アドレス); 

    文字列 HTML = Encoding.UTF8.GetString(HTMLData); 

    / / 正規表現マッチングセット<PまたはP>(少なくとも100の非ヌル文字)<PまたはP> 
    正規表現REG = 新しい新しい正規表現(" <【にpP]>(100 \\ S {、})</ [Ppを]> " ); 
    
    // に一致するすべてのエントリを受け入れる 
    MatchCollection結果= reg.Matches(HTML);
     // ループ出力
    のforeach(マッチ項目結果) 
    { 
        //0は、その文字列は、全体的な目標に合わせて
         @ 1は、第1のグループに一致している(100の\\ S {) 
        Console.WriteLineを(item.Groups [ 1 ]); 
    } 
}

出力:

グループを入力するPタグ(Pバンドがタグ付けされます、[0]である場合にitem.Groupsを照合することによって、バック上記と同じデータを取得する)と一致しません

文字列配列の文字列を分割するitem.Groups [1] .Split(「」)に使用することができるマッチング後、データベース、または他の操作に循環。

三、HTMLパーサNSoup

正規表現を一致させることができますが、正規表現は不慣れな場合は、それが親しみやすいかもしれませんが。大きなとしてのC#動作HTML文字列として動作するHTML要素がJS場合と同様の方法を用いることができます。NSoupを行うことができ、解析HTML文字列が操作可能なオブジェクトとなっています。

管理NuGetパッケージを追加するには、最初に使用する前に:NSoupを、あなたが直接検索することができ、添加が完了した後、次に使用する方法を見て

NSoupClient.Parseを使用します(HTMLコードを配置します。<html> ... </ HTML>)の文Docuemntがドキュメントオブジェクトを作成します。

// ドキュメントオブジェクト宣言 
文書DOC = NSoupClient.Parse(HTML)を、

第二は、文書ドキュメント= NSoupClient.Connect(URLを入れて)に.get()/を使用することです。ポスト()、その後、彼は自動的にHTMLコードのURLアドレスを取得し、DocumentオブジェクトベースのHTMLコードをロードします

// URLオートローダドキュメントオブジェクトを通じて 
文書ドキュメント= NSoupClient.Connect(アドレス)に.get ();

もちろん、他の手段があり、我々はドキュメントオブジェクトを使用する方法を見て

// 要素IDを取得することにより
 // フォーム要素のIDを取得 
要素フォーム= doc.GetElementById();
 // タグ名によって要素を取得
 // すべてのPタグ得る 
要素を、P = doc.GetElementsByTag(P );
 // 要素のクラスのスタイルを取得することで 
 // BTN要素のクラスのスタイルを取得します。 
要素C = doc.GetElementsByClass(BTN );
 // 属性によって取得
 // スタイルを備えた要素を取得し、属性 
の要素がATTR = doc.GetElementsByAttribute(" スタイル");

次の例のように、他の「ネストされた操作と組み合わせることができます。

すべてのpタグのid artContentを取得します。

// プログラムチェーンを使用
 // artContent全てのpタグのIDを取得 
要素doc.GetElementById PS =(" artContent ").GetElementsByTag(" P " );
 // に等しい
 // (要素artContent = doc.GetElementById」をartContent ");
 // 要素artContent.GetElementsByTag PS =(" P「);

方法論の要素:

// 要素の要素要素集合は、Sの複数である
 // 要素オブジェクトメソッド 
要素ID = doc.GetElementById(ID );
 // 取得またはテキストのid要素セット
id.Textを();
 // 取得または設定しますHTMLコードID要素
id.Html();
 // 取得またはid要素の値の値セット 
id.Valを();

HTML要素は、メソッドのjs動作と同じであるが、この方法の非常にユーザーフレンドリー名は、この方法は、方法、それについて1人のあまりにも多くの話によるない1、外観はそれが何を意味するのか知っている基本的です。

その後、我々は非常にシンプルでしょうしようとする、すべての名前を取得NSoup使用します。

 一つの方法:

パブリック 静的 ボイドのGetData(列アドレス)
{ 
    WebクライアントWC = 新しい新しいWebクライアント(); 

    バイト [] = HTMLData wc.DownloadData(アドレス); 

    文字列 HTML = Encoding.UTF8.GetString(HTMLData); 

    文書DOC = NSoupClient.Parse(HTML) ;
     // 最初の我々は、ID artContentを得、その後、全てのpタグの取得された 
    要素doc.GetElementById P =(" artContent ").GetElementsByTag(" Pを" ); 

    foreachの(要素項目P)
    { 
        Console.WriteLineを(項目。テキスト());
    } 

}

第二の方法:

パブリック 静的 ボイドのGetData(列アドレス)
{ 
    // により得られる直接URLドキュメントオブジェクト 
    文書DOC = NSoupClient.Connect(アドレス)に.getは();
     // 第1のID artContentを得、その後、全てのpタグ得る 
    素子Pをdoc.GetElementById =(" artContent ").GetElementsByTag(" P " ); 

    foreachの(要素項目P)
    { 
        Console.WriteLineを(item.Text()); 
    } 

}

営業結果は同じです

概要:効率は、その後、評価をしないかわからない、と単純に長所と短所について話:正規表現を使用し、その後、正規表現の必要性は、特定の親しみを持って、その後、データワードに一致することは非常に便利ですが、追加、変更、それはあまりにも便利ではない場合、削除、HTMLパーサ(HtmlAgilityPack、NSoup)を使用する操作はjsのためのいくつかの根拠があれば、はるかに便利である場合には、HTMLパーサが、その後の要素に精通していることができ、大きな学習を必要としません。変更、追加、削除、アクセスが非常に便利ですが、HTMLの未知の構造は、たとえば、あまり友好的でない場合:あなたは、ページ上のこれらhttp://www.baidu.comアドレスのすべてを取得する場合、使用定期的には良くなります。

 

 

おすすめ

転載: www.cnblogs.com/ckka/p/11423061.html