【问题标题】:Xpath table changes as combobox changes tooXpath 表也随着组合框的变化而变化
【发布时间】:2012-07-10 13:05:39
【问题描述】:

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

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

【问题讨论】:

  • onchange 的组合框您触发一个 Ajax 请求,该请求从服务器获取与从组合框中选择的值相关的数据并显示在表中。所有数据都不存在于 DOM 中。因此,不可能一次获取所有数据。
  • 伙计,我不知道如何在我的项目中使用 Ajax。你能告诉我一些更具体的信息吗?我正在使用 HTMLAgilityPack。非常感谢!
  • 我想说的是,当您动态地获取与从组合框中选择的值相对应的数据时,您的所有数据在任何给定时间点都不存在于 DOM 中。因此 XPath 不是正确的解决方案。

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


【解决方案1】:

因此,当您从下拉列表中选择一个游戏周时(或单击下拉列表上方的“前”或“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 中的 Firebug 或 Fiddler 来获取 URL)。

通过尝试其他周并进行比较,看起来 (selected week - 1) 位于 params 查询字符串的末尾附近:“...%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 字符串输入到 Agility Pack 中,您应该就可以了。

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 2015-06-17
    • 1970-01-01
    • 2018-09-15
    • 2014-06-25
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多