0

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

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

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

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"

回声:1

赏金条款和条件:

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

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

仅在 Android 中

4

4 回答 4

5

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

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

根据您在此页面上的示例,这是不正确的。如果真实数据如你所说

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

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

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

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

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

于 2013-09-03T12:44:57.473 回答
0

如果数据在 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 获取的,并且是分页的,那么这种方法就不再理想了。但是,如果您真的需要一个仅前端的解决方案,正如您所建议的那样,您仍然可以使用这种通用方法并稍作改动。

于 2013-09-05T13:55:59.940 回答
0

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

Java也有一个机械化

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

于 2013-09-03T12:35:03.887 回答
-1

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

使用无头浏览器进行 Android 网页抓取

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

于 2013-09-03T23:54:15.047 回答