Решил я как-то перенести своего Телеграм-бота с Python на Java, дабы подтянуть свой скилл. Все перенес, осталось только самое сложное — HTML-парсинг. На Хабре постов про парсинг на Java не нашел, так почему бы не написать свой?
Выбираем парсер
Поиск в гугле привел к тому, что выбран был парсер jsoup ввиду его популярности, большому количеству туториалов и хорошей документацией.
import org.jsoup.Jsoup;
Парсим
В jsoup можно загрузить HTML-код 3 разными способами:
- Из строки:
str = Jsoup.parse(HTMLSTring);
- С веб-сайта:
web = Jsoup.connect("http://google.com/").get();
- Из файла:
htmlFile = Jsoup.parse(new File("login.html"), "ISO-8859-1");
Мне нужен был парсинг с веба, сейчас для примера будет парсить гугл.
Document doc = Jsoup.connect("https://google.com").get();
Поиск элементов в DOM происходит следующими способами:
- С помощью стандартных методов
getElementById(String id)
,getElementsByTag(String tag)
иgetElementsByClass(String className)
- Элементы, имеющие указанный аттрибут
getElementsByAttribute(String key)
- Элементы, имеющие аттрибут с значением
getElementsByAttributeValue(String key, String value)
- С помощью CSS-подобного селектора (aka jQuery)
select("a[href]")
Например, хотим найти текст кнопки с аттрибутом jsaction=sf.chk
Document doc = Jsoup.connect("https://www.google.com").get();
Element button = doc.select("input[jsaction=\"sf.chk\"]").first();
System.out.print(button.val());
Или:
Element button = doc.body().getElementsByAttributeValue("jsaction", "sf.chk").first();
Тут кому как удобнее. А теперь найдем главное поле ввода и выведем значение его аттрибута title:
Element input = doc.body().getElementById("lst-ib");
System.out.print(input.attr("title"));
А вот текст ссылки с почтой:
doc.select("a.gb_P[data-pid=\"23\"]").first().text();
Выводы
Как видите, парсинг HTML на Java — не такая и страшная штука как казалось. Надеюсь с моей помощью вы без труда разберете на тэги любой сайт. Удачного парсинга!
Комментарии (5)
Lure_of_Chaos
03.10.2017 07:27+1Есть некоторые темы, которые с опытом стали неким «красным флагом», т.е. «если Вам надо идти этим путем, то, вероятно, Вы делаете что-то не так», и, в таком случае, наверняка есть путь проще и быстрее. Парсинг HTML — одна из этих тем.
Скажите, зачем Вам вообще необходимо парсить HTML?siziyman
03.10.2017 09:11Я б ещё аккуратно отметил, что Java-библиотеки — обёртки над Telegram API (которое, кстати, тоже ж можно без парсинга HTML использовать) вполне себе есть. Не думаю, что это та сфера, где стоит так яро изобретать велосипеды. Ну или если изобретать — то почему парсер готовый?
dikkini
03.10.2017 15:28Я вот пока еще не решил задачу, но очень хочу. Хочу получить всех друзей в социальной сети (fb, vk) определённого пользователя. Сделать это через API нет возможности, так как подобное API закрыли, а решить задачу очень хочется. Я пока что, кроме парсинга HTML не нашел, но даже не начинаю реализовать это так как понимаю всю печаль. Что делать?
tehSLy
03.10.2017 10:18+2Как я вижу статью:
Решил я
попиарить свой телегрампопарсить HTML. Ипопиарилпопарсил. Спасибо за внимание!
botaniQQQ
Действительно MonsterDeveloper, из документации написать статью. Прячьте, пока в карму не накидали минусов.