Выбор инструмента для получения данных.

Для получения данных парсеры взаимодействуют с разметкой документов, написанной на языке разметки 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("http://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); /**добавляем строку в список строк **/

Document object model (объектная модель документа).

Когда вы открываете веб-страницу в браузере, он получает исходный текст HTML и разбирает (парсит) его. Браузер строит модель структуры документа и использует её, чтобы нарисовать страницу на экране.Вы можете читать её и изменять. Она изменяется в реальном времени – как только вы её подправляете, страница на экране обновляется, отражая изменения.

Структура документа

Можно представить HTML как набор вложенных коробок. Теги включают в себя теги, которые в свою очередь включают теги, или текст.

Структура данных, использующаяся браузером для представления документа, отражает его форму. Для каждой коробки есть объект, с которым мы можем взаимодействовать и узнавать про него разные данные – какой тег он представляет, какие коробки и текст содержит. Это представление называется Document Object Model (объектная модель документа), или сокращённо DOM. Мы можем получить доступ к этим объектам через глобальную переменную document. Её свойство documentElement ссылается на объект, представляющий тег . Он также предоставляет свойства head и body, в которых содержатся объекты для соответствующих элементов.

Деревья

Каждый узел может ссылаться на другие узлы, у каждого из ответвлений может быть своё ответвление. Эта структура – типичный пример вложенных структур, где элементы содержат подэлементы, похожие на них самих.

У типичного дерева есть разные узлы. Называется структура данных деревом, когда она разветвляется, не имеет циклов (узел не может содержать сам себя), и имеет единственный ярко выраженный «корень». В случае DOM в качестве корня выступает document.documentElement.

У каждого узлового объекта DOM есть свойство nodeType, содержащее цифровой код, определяющий тип узла. У обычных элементов он равен 1, что также определено в виде свойства-константы document.ELEMENT_NODE. У текстовых узлов, представляющих отрывки текста, он равен 3 (document.TEXT_NODE). У комментариев - 8 (document.COMMENT_NODE).Узлы DOM содержат много ссылок на соседние.

Согласно DOM-модели, документ является иерархией.Каждый HTML-тег образует отдельный элемент-узел, каждый фрагмент текста - текстовый элемент, и т.п.

Проще говоря, DOM - это представление документа в виде дерева тегов. Это дерево образуется за счет вложенной структуры тегов плюс текстовые фрагменты страницы, каждый из которых образует отдельный узел.

Самый внешний тег -<html>, поэтому дерево начинает расти от него.Внутри <html> находятся два узла: <head> и <body> - они становятся дочерними узлами для <html>

Теги образуютузлы-элементы(element node). Текст представлен текстовыми узлами (text node). И то и другое - равноправные узлы дерева DOM.

Корневым элементом иерархии является html. У него есть два потомка. Первый - head, второй - body. Дерево образуется за счет элементов-узлов - тегов HTML.

HTML

Язык разметки гипертекста HTML (Hyper Text Markup Language) является основой Всемирной паутины. Именно он является основой создания веб-страниц. С помощью HTML осуществляется логическое форматирование документа, и только для этих целей он и может использоваться.

Структура HTML-документа

HTML-документы строятся на основе тегов, которые структурируют документ. Обычно теги бывают парными, т. е. состоят из открывающего и закрывающего тега, хотя бывают и исключения. Имена открывающих тегов заключаются в угловые скобки < … >, а закрывающих помимо этого еще и предваряются знаком слеш </ … >.

HTML-документ обрамляется парными тегами <html> … </html>. Кроме того, для обеспечения корректного отображения документа современный стандарт требует использования одиночного тега <!DOCTYPE>, имеющего следующую структуру:

<!DOCTYPE HTML PUBLIC>

HTML-документы состоят из заголовка и тела документа. Заголовок и тело документа представляются парными тегами <head> … </head> и <body> … </body>, соответственно. Таким образом, каркас HTML-документа будет иметь следующую структуру:

<!DOCTYPEHTMLPUBLIC>

<html>

<head>

СОДЕРЖАНИЕ ЗАГОЛОВКА

</head>

<body>

СОДЕРЖАНИЕ ТЕЛА ДОКУМЕНТА

</body>

</html>

Заголовок включает в себя несколько специализированных тегов, основными из которых являются <title> … </title> и <meta> … </meta>

Тег <title> содержит заголовок документа, который будет выводится в заголовочной части окна браузера. Тег <meta> содержит специальную информацию, такую как тип кодировки:

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

а так же список ключевых слов и информацию о содержании сайта:

<meta name="keywords" content="списокключевыхслов">

Первое необходимо для корректной поддержки кодировки, а второе позволяет поисковым машинам производить корректное индексирование страниц (следует заметить, что современные поисковые системы обычно игнорируют ключевые слова, но это не отменяет необходимости использования этого атрибута).

В рассмотренных тегах name="keywords" и content="список ключевых слов" являются атрибутами тегов, которые конкретизируют их. Например, атрибуты могут указывать, что текст, заключенный в данном теге, при отображении должен выравниваться по центру. Атрибуты записываются сразу после имени тега, причем значения атрибутов заключаются в кавычки. Атрибутов у тега может быть несколько, но могут и вовсе отсутствовать.

Таблицы

Таблицы являются одной из основных структур, используемых для структурирования информации в HTML-документах. Кроме того, таблицы часто используются для организации структуры страницы, и хотя сейчас такое использование таблиц признано устаревшем и не рекомендуемым, оно до сих пор применяется многими веб-дизайнерами.

Наши рекомендации