当组合框也发生变化时,Xpath表也会发生变化

时间:2012-07-10 13:05:39

标签: xpath combobox web-scraping html-agility-pack

我正在使用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”选项,才能看到组合框。

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

1 个答案:

答案 0 :(得分:0)

因此,当您从下拉列表中选择游戏周时(或单击下拉列表上方的“anterior”或“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&params=%7B%22page%22%3A13%7D

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

通过尝试其他几周并进行比较,看起来(选择的周 - 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,您就应该开始了。