【问题标题】:Parse HTML table generated by jQuery解析 jQuery 生成的 HTML 表格
【发布时间】:2013-08-30 05:41:15
【问题描述】:

我需要解析一个网站的数据,该网站使用 jQuery 从他们的数据库中生成一个表,他们不想为我提供任何其他方式(纯 html、xml 等)的数据。 根据我以前的经验,我可以轻松地直接从 html 文件中解析数据,因为数据位于它自己的 html 文件中,但在这种情况下,表似乎是在浏览器内存中生成的,如果我尝试从 html 中解析,我唯一得到的是 javascript(jquery) 本身,并且内部没有

标记。

问题是,有没有办法以纯 HTML 格式获取这些表格? (我期待解决方案是 android/Java,但也欢迎其他语言/平台)

编辑: 对于那些想查看数据示例的人,我无法给出真实数据,但以下示例是我需要解析的数据的exact示例:

http://datatables.net/examples/data_sources/server_side.html

有表格但是如果你打开html的源代码,你找不到数据,不知何故它是在html加载后在浏览器的内存中生成的,然后从服务器获取它

根据 Saranya Sadhasivam 的要求,以下是示例数据输出

aaData: [[916, LATE, 14:38, SUCCESS, null], [532, EARLY, 14:42, SUCCESS, null],…]

iTotalDisplayRecords: 15

iTotalRecords: 15

oa00f43afb3246649816c727d67db0df9476346d5:"QBUSRAQOQQEWVw8SWlIEURZNRVwMTkEUSBUQCxAGXB9EV04SQVsYSF9AChBaUxFbH3NhK0oDBVQDXgZ‌​WWgUGOjljNWY0NGVj"

sEcho: 1

赏金条款和条件:

第一个无需访问服务器端数据即可从以下链接解析表数据的人:

http://datatables.net/examples/data_sources/server_side.html

仅在 Android 中

【问题讨论】:

  • 你能把你试过的代码发过来吗?
  • 您还可以使用 jquery/javascript 创建表格和行/单元格,并使用您获得的数据填充它。你能显示数据吗
  • 嗨 Saranaya/Jez D,我不能给你真实的网站,但如果你想要这个例子,这正是我需要解析的 datatables.net/examples/data_sources/server_side.html,记住我不能访问服务器端所以任何Server Sides 解决方案是行不通的,我需要直接解析它。
  • @FerryHtw,服务器端的返回数据是什么?
  • 嗨Saranaya,我不知道我不能访问服务器端,它出现在浏览器上,如果你打开这个链接datatables.net/examples/data_sources/server_side.html这正是我需要解析的数据,我需要能够解析那里显示的表格上的数据(Gecko、Firefox 等),问题是我无法解析它,因为表格中没有 标签。

标签: android jquery html parsing


【解决方案1】:

您的目标被误导了,因为您在问题中做出了错误的断言。

他们不想以任何其他方式提供数据

根据this page. 的示例,如果真实数据如您所说,这不是真的

但在这种情况下,表似乎是在浏览器内存中生成的,如果我尝试从 html 解析,我得到的唯一东西是 javascript(jquery) 本身并且没有

标签内。

这似乎表明该站点正在使用AJAX查询JSON中的数据,然后生成数据表。这意味着数据 IS 以另一种方式提供 - JSON。现在您的问题不再是“如何解析由 jQuery 生成的 HTML 表格?”而是“我如何在 Android 中解析 JSON”,在这种情况下,this question 持有您的答案。

我意识到这个答案并没有解决问题按要求,但它确实是正确的方法。如果数据已经以标准数据格式 (JSON) 可用,您不想解析从 jQuery 插件生成的复杂表(很容易更改)。

编辑:我不担心获得赏金,因为我没有回答赏金条件定义的确切参数,但我真的认为你让问题变得更难是,并通过说您只能解析 HTML 页面而不是 HTML 页面本身使用的端点的 JSON 输出来对自己施加不必要的限制。

编辑 2:(来自我对提问者回答的评论)这是对这种情况的一个比喻。你需要一些木头来建造一个棚子。您决定聘请承包商为您建造房屋,然后决定将房屋拆开,以便找到木头来建造您的棚屋。你问“我怎样才能最好地拆开房子来得到木头?”我的回答是“不要。去商店直接买木头。”

【讨论】:

  • 你答对了。提问者要么弄错了,要么遗漏了重要信息。
  • 经过研究和思考后,我找到了一个正确的“Google 关键字”来找到我想要的东西,我想我已经找到了一种方法并且它确实能够做到。关键字“无 GUI 浏览器”或“无头浏览器”,这正是我需要的,我不必考虑服务器端、json 和响应,只需“如果浏览器可以加载它,然后从中删除表格”。一些示例(但不理想)示例来自此链接 stackoverflow.com/questions/17399055/… ,我会在可行时更新答案。
  • @FerryHtw 你错过了我回答的重点。 JSON 数据输出旨在执行您想要执行的操作。您无需加载网页,而是加载 JSON 端点(这与 HTML 一样通过 HTTP(s) 完成)。你把问题复杂化了。
  • @xdumain:由于我应该发送请求的 JSON url 导致我无法通过 JSON 的原因是每次加载页面时都会发生变化,以前的 Web 开发人员确保没有人无法访问到服务器端数据,没有人可以开发网站。这就是为什么在 T&C 中我提到我无法访问服务器端数据并且我知道这很困难,这就是我制作这个 BOUNTY 的原因。但现在我知道这是可能的。顺便说一句,如果你错过了我上面写的内容,对不起,英语不是我的日常语言,但我会努力做到最好。
  • @FerryHtw 访问 JSON 并不比访问 HTML 更“访问服务器端数据”。如果 JSON url 发生变化,只需抓取 that 并执行 AJAX 调用。你是说之前的开发者在 AJAX 调用中添加了某种基于令牌的身份验证?这太荒谬了。
【解决方案2】:

我认为你在使用Android解析时会遇到一些麻烦,但你可以使用服务器进行解析并使用它来将数据发送到Android句柄。 为此,您可以使用MechanizeFirefox extension 来处理javascript。您需要它,因为仅使用 mechanize 无法处理 JS,只能处理浏览器。并且表中的数据是在页面onLoad之后生成的(所以需要用JS处理,所以不能直接在html中解析)。

还有一个Mechanize for Java

您可以使用其他选项,在这个post 中显示了真正的Web 浏览器的选项来处理JS。我从未使用过这些选项,但您可以尝试一下。

【讨论】:

    【解决方案3】:

    如果数据在 jQuery DataTables 对象中,如示例所示,则应使用$("#example").DataTable().fnGetData()。数据在源代码中不显示为 HTML,因为它是动态生成的,正如您在上面指出的那样。源代码中可能存在某种形式的数据,可能是隐藏输入中的 JSON,或者它可能在外部文件中或通过 AJAX 获取,但在 DataTables 为您解析后访问它并没有错.

    显然,您只需要在第一个术语中使用 DataTable 实例的 id 作为您的选择器。为示例运行上面的行会返回以下格式的数据:

    [["Gecko", "Firefox 1.0", "Win 98+ / OSX.2+", 2 more...], ["Gecko", "Firefox 1.5", "Win 98+ / OSX.2+", 2 more...], ["Gecko", "Firefox 2.0", "Win 98+ / OSX.2+", 2 more...], ["Gecko", "Firefox 3.0", "Win 2k+ / OSX.3+", 2 more...], ["Gecko", "Camino 1.0", "OSX.2+", 2 more...], ["Gecko", "Camino 1.5", "OSX.3+", 2 more...], ["Gecko", "Netscape 7.2", "Win 95+ / Mac OS 8.6-9.2", 2 more...], ["Gecko", "Netscape Browser 8", "Win 98SE+", 2 more...], ["Gecko", "Netscape Navigator 9", "Win 98+ / OSX.2+", 2 more...], ["Gecko", "Mozilla 1.0", "Win 95+ / OSX.1+", 2 more...]]
    

    如果通过 AJAX 获取数据,并进行分页,则此方法不再理想。但是,如果您真的需要一个仅前端的解决方案,正如您所建议的那样,您仍然可以使用这种通用方法,但需要稍作改动。

    【讨论】:

      【解决方案4】:

      经过研究和思考,我找到了一个正确的“Google 关键字”来找到我想要的东西,我想我已经找到了一种方法并且它确实能够做到。关键字是“无 GUI 浏览器”或“无头浏览器”,这正是我需要的,我不必考虑服务器端数据、json 和响应,只需“如果浏览器可以加载它,并且可以运行Javascript,您可以在其中看到表格,然后从中删除表格”。一些示例(但不是理想的)示例来自此链接

      Android Web Scraping with a Headless Browser

      我会更新答案,然后我会确认它是否有效以及我将使用什么方法

      【讨论】:

      • 这不是这样做的方法。该网页对 JSON 数据执行 ajax 调用。您想加载相同的确切数据。当您可以直接读取 JSON 结果时,为什么要抓取 HTML?这就像说“我想雇一个承包商盖房子,然后我想把房子拆开用木头。”我会回答:“你为什么不自己从商店买木头?”
      猜你喜欢
      • 2014-09-23
      • 2017-10-10
      • 2013-01-02
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 2011-01-04
      • 2013-04-09
      • 2015-08-17
      相关资源
      最近更新 更多