Решил я как-то перенести своего Телеграм-бота с 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)


  1. botaniQQQ
    03.10.2017 00:25
    +6

    Действительно MonsterDeveloper, из документации написать статью. Прячьте, пока в карму не накидали минусов.


  1. Lure_of_Chaos
    03.10.2017 07:27
    +1

    Есть некоторые темы, которые с опытом стали неким «красным флагом», т.е. «если Вам надо идти этим путем, то, вероятно, Вы делаете что-то не так», и, в таком случае, наверняка есть путь проще и быстрее. Парсинг HTML — одна из этих тем.
    Скажите, зачем Вам вообще необходимо парсить HTML?


    1. siziyman
      03.10.2017 09:11

      Я б ещё аккуратно отметил, что Java-библиотеки — обёртки над Telegram API (которое, кстати, тоже ж можно без парсинга HTML использовать) вполне себе есть. Не думаю, что это та сфера, где стоит так яро изобретать велосипеды. Ну или если изобретать — то почему парсер готовый?


    1. dikkini
      03.10.2017 15:28

      Я вот пока еще не решил задачу, но очень хочу. Хочу получить всех друзей в социальной сети (fb, vk) определённого пользователя. Сделать это через API нет возможности, так как подобное API закрыли, а решить задачу очень хочется. Я пока что, кроме парсинга HTML не нашел, но даже не начинаю реализовать это так как понимаю всю печаль. Что делать?


  1. tehSLy
    03.10.2017 10:18
    +2

    Как я вижу статью:

    Решил я попиарить свой телеграм попарсить HTML. И попиарил попарсил. Спасибо за внимание!