我需要解析一个使用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
答案 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处理器。 为此,您可以使用Mechanize和Firefox extension来处理javascript。你需要它,因为仅机械化无法处理JS,只能处理浏览器。表格中的数据是在页面onLoad之后生成的(所以你需要处理JS,这就是你不能直接在html中解析的原因)。
您可以使用其他选项,在此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
我会更新答案然后我会确认它是否有效以及我将采用何种方法