Jsoup.parse()方法的替代方案

时间:2013-12-05 16:37:08

标签: android html json parsing jsoup

我使用Jsoup.parse()来解析this data。一切都很好,但需要很长时间。

例如,此数据需要20秒。用于解析。是否有其他解决方案满足我的需求?

代码:

rezult = Jsoup.parse(res.parse().outerHtml(), "UTF-8").text();

res Jsoup.parse()来自link的文字。

===========更新=============

我将此变量与Jsoup.parse()分开,并了解它是问题的根源。这需要20秒,而不是String tmp = res.parse().outerHtml();

rezult = Jsoup.parse(tmp, "UTF-8").text();

而这只需要1秒钟。

Jsoup.parse()

我使用此代码从此链接获取数据。我使用<html> <head></head> <body> {&quot;success&quot;:true,&quot;currentUser&quot;:43743,&quot;careTypes&quot;:[{&quot;id&quot;:1,&quot;name&quot;:&quot;\u0421\u0442\u0438\u0440\u043a\u0430&quot;,&quot;description&quot;:&quot;\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0438\u0440\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u0436\u0438\u043c.&quot;},{&quot;id&quot;:2,&quot;name&quot;:&quot;\u041e\u0442\u0431\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0435&quot;,&quot;description&quot;:&quot;\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0442\u0431\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435 因为没有它我得到这样的东西:

{"success":true,"currentUser":43743,"careTypes":[{"id":1,"name":"\u0421\u0442\u0438\u0440\u043a\u0430","description":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0438\u0440\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u0436\u0438\u043c."},{"id":2,"name":"\u041e\u0442\u0431\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0435","description":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0442\u0431\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435 
而不是这个:

res.parse()

但现在主要的问题是将 long t2 = System.currentTimeMillis(); try { Connection connection = Jsoup.connect(url) .method(Connection.Method.POST) .cookies(cookies) .timeout(30000) .ignoreContentType(true); if (data != null) { connection.data(data); } res = connection.execute(); Logger.d(System.currentTimeMillis() - t2 + " = connection.execute"); long t6 = System.currentTimeMillis(); String tmp = res.parse().outerHtml(); Logger.d(System.currentTimeMillis() - t6 + " = res.parse().outerHtml()"); long t4 = System.currentTimeMillis(); rezult = Jsoup.parse(tmp, "UTF-8").text(); Logger.d(System.currentTimeMillis() - t4 + " = Jsoup.parse"); 方法更改为其他更少执行时间的方法。

===========更新2 =============

1588 = connection.execute
16150 = res.parse().outerHtml()
1466 = Jsoup.parse

我在Logcat中得到了什么:

{{1}}

2 个答案:

答案 0 :(得分:0)

使用eval()。另外,请确保源eval()是安全的。 eval()将尝试评估任何语句,因此可能会导致安全问题未正确使用

答案 1 :(得分:0)

我找到了解决这个问题的方法。

Jsoup lib中还有其他方法可以在不解析的情况下获取页面内容。

解决方案是改变这一行:

String tmp = res.parse().outerHtml();

在这一行:

String tmp = res.body();

20次真的快了。可能是他们做了不同的工作,但在我的需要中也是如此。