php simple html dom parser документация на русском
Учимся парсить сайты с библиотекой PHP Simple HTML DOM Parser
Те, кто хоть раз писал парсер, знает, что не стоит этого делать с помощью регулярных выражений. Проиллюстрировать это утверждение поможет следующий пример.
К примеру, из него нам нужно получить описание и url сайта. Если брать исключительно этот кусок кода, то все решается достаточно просто:
Проблемы начинаются тогда, когда описание сайта заполняют пользователи, и оно не имеет определенного шаблона.
Такой код регулярному выражению не по зубам.
Обычно, в вузах на этот случай учат писать конечный автомат. Суть его в том, что мы перебираем, посимвольно, весь html текст, находим начало тега, и строим дерево документа. Так называемое DOM (Document Object Model)
Сейчас, писать такое самому нет необходимости.
В php, начиная с версии 5, есть встроенные методы работы с деревом документа (класс DOMDocument), но основан он на XML парсере.
А HTML и XML это хоть и очень похожие, но в тоже время абсолютно разные технологии.
К примеру, непременное требование к XML это закрытые теги и отсутствие ошибок.
Отсюда вытекает условие: ошибок в html, который мы парсим с помощью нативных средств php, быть не должно.
К сожалению, на сайтах донорах, ошибки не редки, а значит этот метод отпадает.
Некоторые из них, после небольших манипуляций скармливают html тому же DOMDocument. Мы не будем их рассматривать.
В этой статье я расскажу про SimpleHTMLDOM. Этой библиотекой я пользуюсь уже несколько лет, и она меня еще ни разу не подводила.
Скачиваем последнюю версию здесь.
Пусть Вас не смущает то, что она не обновлялась с 2008 года, то, что она умеет, полностью покроет Ваши нужды в разборе html текстов.
В архиве, который вы скачали, две папки (примеры работы и документация) и файл simple_html_dom.php.
simple_html_dom.php это и есть вся библиотека, больше ничего для работы не потребуется. Кидаем этот файл в папку с проектом и в своем скрипте просто подгружаем его.
Кроме документации, которую вы скачали с архивом, доступна еще online версия, ее вы найдете здесь
Файл подключен и готов к работе.
Для того, чтобы начать разбирать HTML, его сперва нужно получить. Обычно, я делаю это при помощи библиотеки CURL.
В simplehtmldom есть методы для удаленной загрузки страниц. После подключения файла библиотеки, нам доступны 2 функции для обработки HTML строк.
str_get_htm(str) и file_get_html(url)
Они делают одно и тоже, преобразуют HTML текст в DOM дерево, различаются лишь источники.
str_get_htm – на вход получает обычную строку, т.е. если вы получили HTML прибегнув к curl, или file_get_contents то вы просто передаете полученный текст этой функции.
Парсинг от А до Я
Блог о программировании парсеров и web-автоматизации
Поиск по блогу
четверг, 20 мая 2010 г.
PHP Simple HTML DOM Parser
A simple PHP HTML DOM parser written in PHP5+, supports invalid HTML, and provides a very easy way to handle HTML elements.
Еще в числе плюсов, которые я отметила, — отсутствие проблем с кодировками. Часто бывает, что, получив содержимое страницы с помощью, например, file_get_contents, кодировку данных на промежуточном этапе приходится преобразовывать. Здесь же такой надобности у меня пока что не возникало.
С помощью этой библиотеки вы можете обращаться к элементам и атрибутам элементов, искать определенного уровня вложенные элементы, фильтровать их, искать текст и комментарии(!).
Приведу примеры из документации:
Вот так будет выглядеть код с использованием Simple HTML DOM Parser :
А вот код с использованием domDocument :
Зато я визуально смогла оценить работу библиотеки Simple HTML DOM Parser с «невалидным» html. Если перед строкой
не поставить «@», то при работе скрипта с domDocument вывалится куча варнингов типа:
Warning: DOMDocument::loadHTML() [function.DOMDocument-loadHTML]: Tag nobr invalid in Entity, line: 5
Warning: DOMDocument::loadHTML() [function.DOMDocument-loadHTML]: htmlParseEntityRef: expecting ‘;’ in Entity, line: 5
Кроме того видна разница и в выводе результатов (кодировка):
В общем, библиотека мне нравится, кто еще не пользовался — советую попробовать.
Чтобы быть в курсе обновлений блога, можно подписаться на RSS.
PHP парсинг HTML, с помощью simple HTML DOM
Просто следуйте всем шагам статьи, и узнаете много нового и полезного для себя!
Шаг 1 – Подготовка
Для начала, вам необходимо скачать копию simple HTML dom библиотеки. Скачивание свободно.
Шаг 2 – Основы HTML парсинга
Эта библиотека, очень проста в использовании, но все же, необходимо разобрать некоторые основы, перед тем как ее использовать.
Загрузка HTML
Все просто, вы можете создать объект, загружая HTML из строки. Или, загрузить HTML код из файла. Загрузить файл вы можете по URL адресу, или с вашей локальной файловой системы (сервера).
Важно помнить: Метод load_file(), работает на использовании PHP функции file_get_contents. Если в вашем файле php.ini, параметр allow_url_fopen не установлен как true, вы не сможете получать HTML файлы по удаленному адресу. Но, вы сможете загрузить эти файлы, используя библиотеку CURL. Далее, прочитать содержимое, используя метод load().
Получение доступа к HTML DOM объектам
Предположим у нас уже есть DOM объект, структурой, как на картинке выше. Вы можете начать работать с ним, используя метод find(), и создавая коллекции. Коллекции – это группы объектов, найденные с помощью селекторов – синтаксис в чем-то схож с jQuery.
Используя этот пример HTML кода, мы узнаем, как получить доступ к информации заключенной во втором параграфе (p). Также, мы изменим полученную информацию и выведем результат на дисплей.
Как видите реализовать PHP парсинг документа HTML, очень даже просто, используя simple HTML DOM библиотеку. В принципе, в этом куске PHP кода, все можно понять интуитивно, но если вы в чем-то сомневаетесь, мы рассмотрим код.
Линия 2-4: подключаем библиотеку, создаем объект класса и загружаем HTML код из строки.
Линия 7: С помощью данной строки, находим все
теги в HTML коде, и сохраняем в переменной в виде массива. Первый параграф будет иметь индекс 0, остальные параграфы будут индексированы соответственно 1,2,3…
Линия 10: Получаем содержимое второго параграфа в нашей коллекции. Его индекс будет 1. Также мы вносим изменения в текст с помощью атрибута innertext. Атрибут innertext, меняет все содержимое внутри указанного тега. Также мы сможем изменить сам тег с помощью атрибута outertext.
Давайте добавим еще одну строку PHP кода, с помощью которой мы назначим класс стиля нашему параграфу.
Результатом выполнения нашего кода будет следующий HTML документ:
Другие селекторы
Ниже приведены другие примеры селекторов. Если вы использовали jQuery, то в библиотеке simple html dom синтаксис немножко схожий.
Использование первого селектора при php парсинге html документа, очень простое и понятное. Его уникальность в том что он возвращает только один html элемент, в отличии от других, которые возвращают массив (коллекцию). Вторым параметром (0), мы указываем, что нам необходим только первый элемент нашей коллекции. Надеюсь, вам понятны все варианты селекторов библиотеки simple HTML DOM, если вы чего-то не поняли, попробуйте метод научного эксперимента. Если даже он не помог, обратитесь в комментарии к статье.
Документация библиотеки simple HTML DOM
Полнейшую документацию по использованию библиотеки simple HTML DOM вы сможете найти по этому адресу:
Просто предоставлю вам иллюстрацию, которая показывает возможные свойства выбранного HTML DOM элемента.
Шаг 3 – Реальный пример PHP парсинга HTML документа
Для примера парсинга, и приведения HTML DOM библиотеки в действие, мы напишем грабер материалов на сайте sitear.ru. Далее мы выведем все статьи в виде списка, в котором будут указаны названия статей. При написании граберов, помните, кража контента преследуется законом! Но не в случае, когда на странице стоит активная ссылка на исходный документ.
Начинаем с подключения библиотеки, и вызова функции getArticles, которая будет парсить HTML документы соответственно адресу страницы, которая передается в качестве параметра функции.
Также мы указываем глобальный массив, в котором будет, хранится вся информация о статьях. Перед тем как начать парсинг HTML документа, давайте посмотрим, как он выглядит.
Шаг 4 – Пишем основную функцию PHP парсера HTML
Вначале функции, мы вызываем наш глобальный массив, который мы указали ранее. Создаем новый объект simple_html_dom. Далее загружаем страницу, которую будем парсить.
Шаг 5 – Находим нужную информацию
В этом куске кода все предельно просто, мы находим все div с class=name_material. Далее читаем коллекцию элементов и выбираем названия материалов. Все материалы будут сохранены в массиве в данном виде:
Шаг 6 – Выводим результат парсинга
Для начала, мы установим некоторые стили, для красоты выводимой информации, которую получили при парсинге.
Далее, с помощью нескольких строк PHP кода, мы выведем информацию.
Результатом выполнения данного скрипта, будет список названий статей на сайте sitear.ru.
Заключение
Вот мы и научились php парсингу html документов. Помните, что парсинг это долгий процесс. Одна страница может парситься около одной секунды. Если вы будете делать парсинг большого числа HTML документов, ваш сервер может перервать работу скрипта в связи с истечением время отведенного для выполнения. Это можно исправить с помощью функции set_time_limit(240); 240 – это время в секундах, отведенное на выполнение скрипта.
Эта статья предназначена для формирования основных понятий парсинга HTML страницы с помощью PHP. Существуют и другие библиотеки и методы парсинга. Если вы знаете таковые, поделитесь в комментариях. Буду рад, узнать какими инструментами и методами html парсинга пользуетесь вы.
PHP HTML DOM парсер с jQuery подобными селекторами
Добрый день, уважаемые хабровчане. В данном посте речь пойдет о совместном проекте S. C. Chen и John Schlick под названием PHP Simple HTML DOM Parser (ссылки на sourceforge).
Идея проекта — создать инструмент позволяющий работать с html кодом используя jQuery подобные селекторы. Оригинальная идея принадлежит Jose Solorzano’s и реализована для php четвертой версии. Данный же проект является более усовершенствованной версией базирующейся на php5+.
В обзоре будут представлены краткие выдержки из официального мануала, а также пример реализации парсера для twitter. Справедливости ради, следует указать, что похожий пост уже присутствует на habrahabr, но на мой взгляд, содержит слишком малое количество информации. Кого заинтересовала данная тема, добро пожаловать под кат.
Получение html кода страницы
Товарищ Fedcomp дал полезный комментарий насчет file_get_contents и 404 ответа. Оригинальный скрипт при запросе к 404 странице не возвращает ничего. Чтобы исправить ситуацию, я добавил проверку на get_headers. Доработанный скрипт можно взять тут.
Поиск элемента по имени тега
Модификация html элементов
Получение текстового содержания элемента (plaintext)
Целью статьи не является предоставить исчерпывающую документацию по данному скрипту, подробное описание всех возможностей вы можете найти в официальном мануале, если у сообщества возникнет желание, я с удовольствием переведу весь мануал на русский язык, пока же приведу обещанный в начале статьи пример парсера для twitter.
Пример парсера сообщений из twitter
Вывод сообщений
Благодарю за внимание. Надеюсь, получилось не очень тяжеловесно и легко для восприятия.
PHP парсинг с помощью Simple HTML DOM
Парсинг HTML документа всегда будет являться актуальной темой. Поэтому давайте разберем самый универсальный способ реализации парсера на PHP с помощью библиотеки Simple HTML DOM.
В большинстве случаев для процесса парсинга используют регулярные выражения. Но это не самый лучший способ в связи с трудоемким процессом написания и уменьшения скорости работы PHP приложения. Мы будем использовать библиотеку Simple HTML DOM, с помощью которой можно обращаться к элементам и атрибутам элементов, искать определенного уровня вложенные элементы, фильтровать их, искать текст и комментарии.
Сайт поддержки: PHP Simple HTML DOM Parser. Ссылка на скачивания доступна в меню «Download & Documents«. В архиве содержаться примеры и документация. Нам необходимо подключить файл Simple_html_dom.php, чтобы работать с функциями данной библиотеки.
Сначала необходимо создать объект для работы. Данное действие может происходить путем загрузки из текстовой строки строки либо файла, который являет собой URL адрес в интернете:
Метод Load_file работает на использовании PHP функции File_get_contents, поэтому директива Allow_url_fopen должна быть включена, иначе вы не сможете получать HTML файлы по удаленному адресу.
Если вы сразу увидите одну из ошибок:
Замените в файле «simple_html_dom.php» реализацию функции «file_get_contents» (для версии 1.5 — срока №75 ) на:
Не будем углубляться в сущность данных ошибок, вы просто заменяете данную строку и все работает.
Для примера возьмем самый простой HTML документ:
Создадим коллекцию (группы объектов, найденные с помощью селекторов) на тег заголовка «H1«. Для этого необходимо использовать метод Find:
Для изменения информации можно использовать атрибут Innertext:
Выполним добавления класса для заголовка H1:
Также, мы можем вывести результат на дисплей:
Вот мы разобрали самый простой способ использования библиотеки Simple HTML DOM. Метод Find находит все теги в HTML коде, и сохраняет в переменной в виде массива. Атрибут Innertext вносит изменения в текст, то есть меняет все содержимое внутри указанного тега. Атрибут Class добавляет определенный класс к данному тегу. Метод Save сохраняет изменения. Результатом выполнения нашего кода будет следующий HTML документ:
Теперь давайте разберем, как получать информацию из других селекторов. Для этого нам необходимо в методе Find указывать более конкретную информацию. Например, получить все элементы с class=»post»:
Для получения первого элемента с class=»post», необходимо добавить его номер после указания класса. Первый элемент в массиве имеет индекс — 0:
Поиск может осуществляться и у вложенных тегов, для этого необходимо указать более развернутую структуру поиска, например:
Поиск заголовка, описания и ключевых слов страницы осуществляется так:
В данной статье мы описали только основные понятия библиотеки Simple HTML DOM. Для более подробного ознакомления перейдите на страницу Мануала.