Для получения данных парсеры взаимодействуют с разметкой документов, написанной на языке разметки HTML (либо XML). Существует 2 вида парсеров:
1) SAX (англ. Simple API for XML) – способ последовательного чтения и/или записи HTML/XML-файлов. В ходе последовательного чтения SAX-парсер сообщает вызвавшему приложению о встреченных элементах разметки, а программист в своюочередь описывает нужную обработку данных событий.
2) DOM (англ. Document Object Model) позволяет представить любой документ известной структуры в виде дерева узлов, каждый узел которого представляет собой элемент, атрибут или иной объект. Узлы связаны между собой отношениями «родитель – потомок». DOM- парсеры сначала загружают весь документ разметки, а на выходе представляют дерево, из которого можно получить доступ к содержимому документа.
Что такое Jsoup.
Jsoup это open-source Java библиотека для работы с реальным HTML. Она обеспечивает очень удобный API для извлечения и манипулирования данными, используя лучшие DOM, CSS, и JQuery-подобные методы. Jsoup реализует WHATWG HTML5 спецификацию, и разбирает HTML в ту же модель DOM, как это делают современные браузер вроде Chrome и Firefox. Вот некоторые из полезных функций Jsoup библиотеки:
- Jsoup может очистить и разобрать HTML из URL, файла или строки.
- Jsoup может найти и извлечь данные используя обход DOM или CSS селекторы.
- Jsoup позволяет манипулировать HTML элементами, атрибутами и текстом.
- «Аккуратный» HTML на выходе: при разборе HTML-текста библиотека исправляет ошибки наподобие незакрытых тегов.
Jsoup предназначен для работы с различными видами HTML существующими в реальном мире, включая должным образом подтвержденный HTML c неполным неподтвержденным набором тэгов. Одно из основных преимуществ Jsoup это его надежность.С помощью него очень просто разобрать HTML, все что Вам нужно это вызвать статический метод Jsoup.parse() и передать в него Вашу HTML строку. Jsoup предоставляет несколько перегруженных методов parse() для чтения HTML из строки, файла, из базового URI, из URL и из InputStream. Вы также можете указать кодировку, для корректного чтения HTML файла.[A5]
Получение данных.
Для получения данных используется сторонняя Java-библиотека jsoup. Кроме того, необходимо предоставить приложению доступ в Интернет. Для этого в файл AndroidManifest.xml нужно дописать следующую строку:
<uses-permissionandroid:name="android.permission.INTERNET"/>
В самомклассе Parser надо прописать импорт следующих классов:
importjava.util.List;
importorg.jsoup.nodes.Document;
importorg.jsoup.nodes.Element;
importorg.jsoup.nodes.Node;
importorg.jsoup.parser.CharacterReader;
importorg.jsoup.parser.HtmlTreeBuilder;
importorg.jsoup.parser.ParseError;
importorg.jsoup.parser.ParseErrorList;
importorg.jsoup.parser.ParseSettings;
importorg.jsoup.parser.Tokeniser;
importorg.jsoup.parser.TreeBuilder;
importorg.jsoup.parser.XmlTreeBuilder;
Информация о расписании университета берется с сайта «bsu.ru», и для начала работы необходимо подключитьсяк нужной странице и получить объект класса Document:получаем данные методом GET
org.jsoup.nodes.Document doc = Jsoup. connect ("https://bsu.ru/rasp/?g=" +groupeNum).get();
После подключения нужно извлечь требуемую информацию:
Elements elements = doc.select("div.week");/**разбиваемпонеделям**/
Метод select() позволяет получить нужные теги.
Далее в цикле для каждого элемента списка извлекается нужная информация:
for (Element element: elements) {
Elements el = element.select("table.rasp_week");
for (Element element1: el) {
Elements elements1 = element1.select("td");
for (Element element2: elements1) {
Elements day = element2.select("h3.rasp_day");/*получаемдень**/
for (Element element3: day) {d = element3.text();}
Elements time = element2.select("td.rasp_time");/**время**/
for (Element element3: time) {t = element3.text();}
Elements subj = element2.select("td.rasp_subj");/**предмет**/
for (Element element3: subj) {s = element3.text();}
Elements type = element2.select("td.rasp_subj_type"); /**тип**/
for (Element element3: type) {st = element3.text();}
Elements aud = element2.select("td.rasp_aud");/**номераудит**/
for (Element element3: aud) {a = element3.text();}
Elements week = el.select("table.rasp_week").prev();/*№ недели*/
for (Element element3: week) {w = element3.text();}
Elements name = element2.select("td.rasp_aud").next();/**следующийэлементпосленомера аудитории - имя преподователя**/
for (Element element3: name) {n = element3.text();
/**если день недели совподает то вывести то формируем список**/
if (dayOfWeek.equals(d)) {scheduler = w + "\r\n" +
"Время: " + t + "\r\n" + "Название предмета: " + s + "\r\n" + "Тип пары: " + st +
" Аудитория: " + a + "\r\n" + "Имя преподавателя: " + n + "\r\n\r";
my.add(scheduler); /**добавляем строку в список строк **/
[A1]Примерно отсюда 2 глава должна начинаться, вроде бы
[A2]HДа откуда вы это берете? HTTP-запрос у нас.
[A3]Почему в виде рисунка? Лучше сделать непосредственно в виде текста кода
[A4]
[A5]Этот рисунок не нужен. Далее можно показать, что получение HTML-содержимого выполняется с помощью метода Jsoup.connect(). Можно показать саму HTML-страницу, которую мы получаем. Попробовать нарисовать ее DOM-структуру. Или хотя бы структуру таблицы с расписанием.