0

我正在使用 C# 开发一个应用程序,该应用程序可以访问网站并从表格中获取一些内容。它工作正常,但问题是:当我在组合框中选择不同的值时,我正在获取更改内容的表。我使用的 Xpath 总是获取网站上首先显示的表格,而我不知道如何获取其他表格。我在这里发布所有我认为对你有用的东西来帮助我。

该网页是: 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 semana de jogo”选项,才能看到组合框。

我需要从所有表格中获取所有分数,而不仅仅是出现的那个。

4

1 回答 1

0

因此,当您从下拉列表中选择一个比赛周时(或单击下拉列表上方的“前”或“proximo”链接),页面中的 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%22outgroup%22%3A %22%22%2C%22view%22%3A%221%22%7D&action=changePage¶ms=%7B%22page%22%3A13%7D

(请注意,您也可以使用其他工具,例如 FireFox 中的 Firebug 或 Fiddler 来获取 URL)。

通过尝试其他周并进行比较,看起来 (selected week - 1) 在 params 查询字符串的末尾附近找到:“...%3A13...”。因此,对于第 15 周,您将使用“...%3A14...”。幸运的是,不同周的 URL 之间似乎只有一个差异区域,它位于 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 字符串输入到 Agility Pack 中,您应该可以上路了。

于 2012-07-13T18:41:34.447 回答