Парсим HTML на Android

Если у вас есть проблема, и вы решаете ее с помощью регулярных выражений, — теперь у вас две проблемы.

Встала тут задачка распарсить страницы одного форума на отдельные сообщения в android-приложении. Распарсить на сообщения и выдать их наружу. Да-да-да, в Java я не силен абсолютно.

Берем отличную удобную библиотеку jsoup — умеет скачивать страницы и тут же парсить, имеет поддержку CSS-селекторов для навигации по DOM. Работать одно удовольствие с ней.
Вот получается примерно такой код для фонового загрузчика (облегченный):

public class DownloadThemePageTask extends AsyncTask<void, void, void> {

	@Override
	public ThemePage doInBackground(Void... voids) {
		Log.d(toString(), "START");

		String url = _getUrl();
		Connection connection = Jsoup.connect(url);
		Response response = connection.execute();
		String body = response.body();

		Document doc = Jsoup.parse(body);

		Log.d(toString(), "PARSED");

		return null;
	}
}

В LogCat видим:

09-27 02:11:01.669: DEBUG/DownloadThemePageTask@406fc428(27248): START
09-27 02:11:02.039: DEBUG/dalvikvm(27248): GC_CONCURRENT freed 553K, 52% free 3117K/6407K, external 477K/519K, paused 2ms+2ms
...
09-27 02:11:06.403: DEBUG/dalvikvm(27248): GC_CONCURRENT freed 268K, 47% free 3575K/6727K, external 477K/519K, paused 2ms+2ms
09-27 02:11:07.224: DEBUG/DownloadThemePageTask@406fc428(27248): PARSED

Итого поимели 5.6 секунды, чтобы скачать и распарсить одну страничку.

Делаем финт: вместо парсинга подключаем мощь регулярок. Получается загрузчик:

public class DownloadThemePageTask extends AsyncTask<void, void, void> {

	@Override
	public ThemePage doInBackground(Void... voids) {
		Log.d(toString(), "START");

		String url = _getUrl();
		Connection connection = Jsoup.connect(url);
		Response response = connection.execute();
			
		Pattern pattern = Pattern.compile("<div id="message_(d+)" class="text_box_2_mess">(.+?)</div>s+<a href="#ftop", Pattern.DOTALL);
		Matcher matcher = pattern.matcher(response.body());
		while (matcher.find()) {
			Log.d(toString(), matcher.group(1));
		}
			
		Log.d(toString(), "PARSED");

		return null;
	}
}

LogCat:

09-27 02:29:28.999: DEBUG/DownloadThemePageTask@4061a108(27301): START
09-27 02:29:29.420: DEBUG/dalvikvm(27301): GC_FOR_MALLOC freed 319K, 53% free 2752K/5831K, external 477K/519K, paused 21ms
...
09-27 02:29:29.530: DEBUG/dalvikvm(27301): GC_CONCURRENT freed 96K, 49% free 3111K/6023K, external 477K/519K, paused 2ms+3ms
09-27 02:29:29.530: DEBUG/DownloadThemePageTask@4061a108(27301): 25799144
...
09-27 02:29:29.620: DEBUG/DownloadThemePageTask@4061a108(27301): 25797290
09-27 02:29:29.620: DEBUG/DownloadThemePageTask@4061a108(27301): PARSED

0.62 секунды. Что, в девять раз быстрее?!

Фак май моск, раскукожь их обратно!

Очевидно, конечно же.

Добавить комментарий

Ваш e-mail не будет опубликован.

Поставьте галочки правильно (как бы защита от спама):

Я бот

Я не бот