Альтернатива Jsoup.метод parse()
я использую Jsoup.parse()
для разбора данные. Все работает хорошо, но занимает много времени.
например, эти данные занимают 20 сек. для разбора. Есть ли другие решения для моих нужд?
код:
rezult = Jsoup.parse(res.parse().outerHtml(), "UTF-8").text();
здесь res
это текст ссылке.
=========== обновление =============
я отделяю эту переменную от Jsoup.parse()
и понял, что это источник проблема. Это занимает 20 секунд, а не Jsoup.parse()
.
String tmp = res.parse().outerHtml();
и это занимает всего 1 сек.:
rezult = Jsoup.parse(tmp, "UTF-8").text();
я использую этот код для получения данных по этой ссылке. Я использую Jsoup.parse()
потому что без него у меня что-то вроде этого:
<html>
<head></head>
<body>
{"success":true,"currentUser":43743,"careTypes":[{"id":1,"name":"u0421u0442u0438u0440u043au0430","description":"u041eu043fu0438u0441u0430u043du0438u0435 u0441u0442u0438u0440u043au0438 u043fu043eu044fu0432u0438u0442u0441u044f u0437u0434u0435u0441u044c, u043au0430u043a u0442u043eu043bu044cu043au043e u0432u044b u0432u044bu0431u0435u0440u0435u0442u0435 u0440u0435u043au043eu043cu0435u043du0434u0443u0435u043cu044bu0439 u0440u0435u0436u0438u043c."},{"id":2,"name":"u041eu0442u0431u0435u043bu0438u0432u0430u043du0438u0435","description":"u041eu043fu0438u0441u0430u043du0438u0435 u043eu0442u0431u0435u043bu0438u0432u0430u043du0438u044f u043fu043eu044fu0432u0438u0442u0441u044f u0437u0434u0435u0441u044c, u043au0430u043a u0442u043eu043bu044cu043au043e u0432u044b u0432u044bu0431u0435u0440u0435u0442u0435
вместо этого:
{"success":true,"currentUser":43743,"careTypes":[{"id":1,"name":"u0421u0442u0438u0440u043au0430","description":"u041eu043fu0438u0441u0430u043du0438u0435 u0441u0442u0438u0440u043au0438 u043fu043eu044fu0432u0438u0442u0441u044f u0437u0434u0435u0441u044c, u043au0430u043a u0442u043eu043bu044cu043au043e u0432u044b u0432u044bu0431u0435u0440u0435u0442u0435 u0440u0435u043au043eu043cu0435u043du0434u0443u0435u043cu044bu0439 u0440u0435u0436u0438u043c."},{"id":2,"name":"u041eu0442u0431u0435u043bu0438u0432u0430u043du0438u0435","description":"u041eu043fu0438u0441u0430u043du0438u0435 u043eu0442u0431u0435u043bu0438u0432u0430u043du0438u044f u043fu043eu044fu0432u0438u0442u0441u044f u0437u0434u0435u0441u044c, u043au0430u043a u0442u043eu043bu044cu043au043e u0432u044b u0432u044bu0431u0435u0440u0435u0442u0435
но теперь главная проблема состоит в том, чтобы изменить 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
2 ответов
использовать eval()
. Кроме того, убедитесь, что источник eval()
безопасно. eval()
попытается оценить любой оператор и, таким образом, может потенциально выявить проблемы безопасности не используется должным образом
Я нашел решение этой проблемы.
есть другой метод в Jsoup
lib для получения содержимого страницы без разбора.
решение заключается в изменении этой строки:
String tmp = res.parse().outerHtml();
на эту строку:
String tmp = res.body();
Это действительно быстрее в 20 раз. Может быть, они делают другую работу, но в моих нуждах это то же самое.