2012-07-10 30 views
0

我正在研究C#中的應用程序,該應用程序轉到網站並從表中獲取一些內容。它工作正常,但這裏有個問題:當我在組合框中選擇一個不同的值時,我得到更改內容的表。我使用的Xpath總是獲取首先在網站上顯示的表格,而我不知道如何獲取其他表格。我在這裏張貼我認爲對你有幫助的一切。Xpath表更改爲combobox也

的網頁是: 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 ']"); 

在網站上,你必須點擊 「POR週報德JOGO」 選項,右邊的分數以上,爲組合框將顯示。

我需要從所有表格中獲得所有分數,而不僅僅是出現的分數。

+0

組合框'onchange'您觸發一個Ajax請求,從服務器獲取有關從組合框中選擇的值並顯示在表中的數據。所有的數據都不存在於DOM中。因此,不可能一次獲得所有數據。 – 2012-07-10 13:43:56

+0

男人,我不知道如何在我的項目中使用Ajax。你能告訴我更具體的關於我如何做到這一點?我正在使用HTMLAgilityPack。非常感謝! – 2012-07-10 14:17:03

+1

我想說的是,在任何給定的時間點,您的所有數據都不會出現在DOM中,因爲您可以動態獲取與從組合框中選擇的值相對應的數據。因此XPath不適合這個。 – 2012-07-11 15:16:00

回答

0

因此,當您從下拉列表中選擇一個遊戲周(或點擊下拉菜單上方的「前」或「proximo」鏈接)時,頁面中的JavaScript會調用服務器以獲取選定的遊戲周。它只是通過GET發送一個URL到服務器。

數據以JSON對象的形式返回,並且此對象內部是表格HTML。這個HTML在正確的位置加載到DOM中,瀏覽器顯示該周的數據。

以編程方式獲得此代碼是一項工作,但它可以完成。你可以做的是確定每週的網址。希望大多數查詢字符串除了所討論的那一週都是常量。因此,您將擁有一個樣板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%22outgroup%22%3A%22%22%2C%22view%22%3A%221%22%7D&action=changePage&params=%7B%22page%22%3A13%7D

(請注意,您也可以使用Firefox或其它提琴手工具,如螢火蟲,以獲得URL)。

通過嘗試其他周和比較,它看起來像(選定的一週-1)在附近的參數查詢字符串中找到:「...%3A13 ...」。因此,第15周你會使用「...%3A14 ...」。幸運的是,看起來不同周的URL之間只有一個區別,並且它位於callback_params查詢字符串中。不幸的是,我無法弄清楚它是如何連接到選定的一週,但希望你能。

因此,當您將該URL提供給瀏覽器時,您將返回JSON塊。如果您搜索「<表」和「/表>」,您將看到所需的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串入敏捷性包,你應該對你的方式。