Выбор инструмента для получения данных.
Для получения данных парсеры взаимодействуют с разметкой документов, написанной на языке разметки 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-документах. Кроме того, таблицы часто используются для организации структуры страницы, и хотя сейчас такое использование таблиц признано устаревшем и не рекомендуемым, оно до сих пор применяется многими веб-дизайнерами.