Java→ Парсер HTML в Java (jsoup)
Авг 16, 2011
Не так давно, у меня возникла необходимость парсить html-страницы, выдирая из них нужные ссылки. Первая мысль была сделать это через регулярные выражения. Но здравый смысл подсказывал, что парсить html-код регулярками есть величайшее зло. Стыдно признаться, но программируя на языке Delphi я использовал именно их, так как нормальных средств и компонентов по разбору html-тэгов мне найти так и не удалось.
В противоположность этому, Java, благодаря своей популярности, обладает большим количеством различных библиотек — как встроенных, так и сторонних. Не долго думая, была выбрана первая попавшаяся библиотека — jsoup. Стоит сказать, что данная библиотека достаточно часто обновляется и поддерживает, что не мало важно, HTML5. На сайте представлены простые примеры в две строчки, с помощью которых можно приступать писать приложения, использующие jsoup даже без чтения JavaDoc.
Использование
Для начала необходимо скачать библиотеку jsoup-1.6.1.jar с официального сайта (название файла может отличаться) и аккуратно положить его рядом с файлом вашего класса, например Sample.java
. После этого открываем в своем любимом редакторе файл Sample.java
и пишем следующий код:
import org.jsoup.*; import org.jsoup.nodes.*; import org.jsoup.select.*; import java.io.*; public class Sample { public static void main(String[] args) throws IOException { Document doc = Jsoup.connect("http://tdlite.ru").get(); Elements links = doc.getElementsByTag("a"); for(Element link : links) { System.out.println(link.text()); } } }
Пояснения
Сначала мы импортируем все классы из следующих пакетов:
org.jsoup.*;
— для классаJsoup
org.jsoup.nodes.*;
— для классовDocument
,Element
org.jsoup.select.*;
— для классаElements
java.io.*;
— для классаIOException
Так как метод connect
класса Jsoup
может выбросить исключение, например, если соединение не удалось, нужно методу main
сообщить об этом, добавив throws IOException
. Также вы можете обработать исключение через try-catch
, но в моем случае я не стал усложнять код.
Сразу после connect
, вызывается метод get()
, выполняющий обращение к указанному адресу через GET метод. Если вы хотите обратиться к сайту через POST, то необходимо заменить метод get()
на post()
, а параметры посылать функцией data()
— более подробно об этом вы можете почитать в API.
Теперь, когда содержимое страницы получено, можно парсить html-код, используя различные методы класса Document
. Например, использовав getElementsByTag("a")
мы получим все ссылки, то есть все тэги A, в список links
. Стоит сказать, что тот же самый эффект получится, если использовать селекторы — doc.select("a[href]")
. Получить текст ссылки, или так называемый анкор, можно пройдясь по каждому элементу этого списка и вызвав метод text()
.
Компиляция
Поговорим о компиляции нашего класса Sample
, так как она не совсем тривиальная. Компилятор пока не знает где искать библиотеку и поэтому ему нужно сообщить путь (classpath) к jsoup-1.6.1.jar:
javac -cp ./jsoup-1.6.1.jar Sample.java
Запуск скомпилированного класса необходимо также производить с указанием classpath, но при этом добавить путь к текущей директории, использовав точку и слэш, а в качестве разделителей путей, точку с запятой:
java -cp ./;./jsoup-1.6.1.jar Sample
Кодировка
Если выполнив этот пример в консоли, вы увидите кракозябры, то не пугайтесь — с библиотекой все в порядке. Скорей всего проблема в кодировке самой консоли и решить её можно прочитав предыдущую статью и добавив соответствующие строчки в начало метода main
.
Похожие статьи: