解析jQuery生成的HTML表

时间:2013-08-30 05:41:15

标签: android jquery html parsing

我需要解析一个使用jQuery从他们的数据库生成表的网站的数据,他们不想为我提供任何其他方式的数据(普通的html,xml等)。 根据我以前的经验,我可以直接解析html文件中的数据,因为数据本身就在html文件中,但在这种情况下,表似乎是在浏览器内存中生成的,如果我尝试从html解析,我唯一得到的是javascript(jquery)本身并且没有<表> < 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”

sEcho:1

BOUNTY条款和条件:

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

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

仅限Android

4 个答案:

答案 0 :(得分:5)

你的目标是错误的,因为你在问题中做出了错误的断言。

  

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

根据this page.中的示例,如果真实数据与您说的那样

,那么这是不正确的
  

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

这似乎表明该网站正在使用AJAX查询JSON中的数据,然后生成数据表。这意味着以另一种方式提供的数据 IS - JSON。现在你的问题变成了“我怎样才能解析jQuery生成的HTML表格?”但是,“我如何在Android中解析JSON”,在这种情况下this question会得到你的答案。

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

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

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

答案 1 :(得分:0)

我认为使用Android解析会遇到一些问题,但您可以使用服务器解析并使用它将数据发送到Android处理器。 为此,您可以使用MechanizeFirefox extension来处理javascript。你需要它,因为仅机械化无法处理JS,只能处理浏览器。表格中的数据是在页面onLoad之后生成的(所以你需要处理JS,这就是你不能直接在html中解析的原因)。

也有Mechanize for Java

您可以使用其他选项,在此post中显示真实Web浏览器的选项以处理JS。我从来没有使用过那些选项,但你可以尝试一下。

答案 2 :(得分: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获取的,并且它是分页的,则此方法不再理想。但是,如果您确实需要一个前端解决方案,正如您所建议的那样,您仍然可以使用这种通用方法进行一些扭曲。

答案 3 :(得分:-1)

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

Android Web Scraping with a Headless Browser

我会更新答案然后我会确认它是否有效以及我将采用何种方法