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

Posted

技术标签:

【中文标题】Jsoup.parse() 方法的替代方案【英文标题】:Alternative of Jsoup.parse() method 【发布时间】:2013-12-22 17:18:02 【问题描述】:

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

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

代码:

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

res 是来自link 的文本。

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

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

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

而这个只需要 1 秒:

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

我使用此代码从此链接获取数据。我使用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() 方法更改为执行时间更短的其他方法。

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

 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");

我在 Logcat 中得到了什么:

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

【问题讨论】:

解析该信息不可能花费 20 秒。为什么要解析已经解析的结果?你想做什么? 我更新了帖子,请看。 对我来说仍然很不清楚。期望的结果是什么?你能举一个例子来准确地显示“这就是我想要的结果”吗?您应该知道 Jsoup 无法执行 javascript,如果您要解析的任何文本使用 JavaScript 呈现,您将无法解析它。 我想从此链接 (api.3botinka.com/api/synchronize) 获取带有文本的字符串变量。我需要这个没有任何 HTML 标签的文本。对于这个海豚,我使用 Jsoup。 JavaScript 没关系,当前网页是不可能的。 请将您的代码作为一个整体发布 【参考方案1】:

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

【讨论】:

我不知道eval()这样的方法。你能告诉我如何在我的案例中使用它或给我一些文档的链接吗? 您只需将 eval() 与 parse() 完全一样使用,只需使用单词 eval 而不是 parse。希望它会有所帮助...... Jsoup.Connection 不支持此方法。你确定你使用的是同一个库吗? 好的。对不起 p.Valery!我搞砸了你正在使用特殊的库。【参考方案2】:

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

Jsoup lib 中还有其他方法无需解析即可获取页面内容。

解决方案是更改此行:

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

在这一行:

String tmp = res.body();

确实快了20倍。可能他们做不同的工作,但在我的需要中是一样的。

【讨论】:

以上是关于Jsoup.parse() 方法的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

JSoup - abs:href 获取的绝对地址为空问题

Scala:方法的多个重载替代方案

Android API < 8 的 SpeechRecognizer 类的 stopListening() 方法的替代方案

WPF中TreeView.BringIntoView方法的替代方案

Scala - 处理“方法的多个重载替代方案......定义默认参数”

WPF中TreeView.BringIntoView方法的替代方案