0

私は、Webサイトにアクセスし、テーブルからコンテンツを取得するC#のアプリケーションに取り組んでいます。正常に動作していますが、ここに問題があります。コンボボックスで別の値を選択すると、変更内容を取得するテーブルが変更されます。私が使用するXpathは、常にWebサイトに最初に表示されるテーブルを取得しますが、他のテーブルを取得する方法がわかりません。私はあなたが私を助けるのに役立つと思うすべてをここに投稿します。

ウェブページは次のとおりです。http: //br.soccerway.com/national/brazil/serie-a/2012/regular-season/

xpath / C#コード:

HtmlNodeCollection no2 = doc.DocumentNode
   .SelectNodes("//*[@id='page_competition_1_block_competition_matches_summary_6']/div[2]/table/tbody/tr/td[@class='team team-a ' or @class='date no-repetition' or @class='score-time score' or     @class='team team-b ']");

Webサイトで、コンボボックスを表示するには、スコアのすぐ上にある[Porsemanadejogo]オプションをクリックする必要があります。

表示されるテーブルだけでなく、すべてのテーブルからすべてのスコアを取得する必要があります。

4

1 に答える 1

0

したがって、ドロップダウンからゲームの週を選択すると(または、ドロップダウンの上にある[前方]または[プロキシ]リンクをクリックすると)、ページのJavaScriptがサーバーを呼び出して、選択したゲームの週のデータを取得します。GETを介してサーバーにURLを送信するだけです。

データはJSONオブジェクトの形式で返され、このオブジェクトの中にはテーブルHTMLがあります。このHTMLはDOMの適切な場所に読み込まれ、ブラウザにその週のデータが表示されます。

これをプログラムで取得するのは少し手間がかかりますが、実行することはできます。あなたができることは、毎週のURLが何であるかを決定することです。うまくいけば、問題の週を除いて、ほとんどのクエリ文字列は一定です。したがって、必要な週に微調整する定型URLを作成し、それをサーバーに送信します。JSONを取得し、テーブルHTMLを解析します。次に、あなたは黄金になります。そのHTMLをAgility Packにフィードして、通常どおりに操作するだけです。

少し調べてみたところ、Chromeのデベロッパーツールを使用して、[ネットワーク]タブで、ゲームウィークを選択すると、サーバーに送信されるURLが次のようになっていることがわかりました(これは14週目です)。

http://br.soccerway.com/a/block_competition_matches_summary?block_id=page_competition_1_block_competition_matches_summary_6&callback_params=%7B%22page%22%3A%229%22%2C%22round_id%22%3A%2217449%22%2C%22out %22%22%2C%22view%22%3A%221%22%7D&action = changePage&params =%7B%22page%22%3A13%7D

(FireFoxのFirebugやFiddlerなどの他のツールを使用してURLを取得することもできることに注意してください)。

他の週を試して比較すると、(選択された週-1)がparamsクエリ文字列 "...%3A13..."の終わり近くにあるように見えます。したがって、15週目は、「...%3A14...」を使用します。幸い、異なる週のURL間には、もう1つだけ違いがあるように見えます。これは、callback_paramsクエリ文字列にあります。残念ながら、選択した週にどのように接続するかを理解できませんでしたが、うまくいけば可能です。

したがって、そのURLをブラウザにフィードすると、JSONブロックが返されます。「<table」と「/table>」を検索すると、必要なHTMLが表示されます。C#コードでは、単純な正規表現を使用して、JSON文字列から解析することができます。

string json = "..." // load the JSON string here

RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Singleline;
Regex regx = new Regex( "(?<theTable><table.*/table>)", options );

Match match = regx.Match( json );

if ( match.Success ) {
    string tableHtml = match.Groups["theTable"].Value;
}

HTML文字列をAgilityPackにフィードすると、準備が整います。

于 2012-07-13T18:41:34.447 に答える