php simple dom - библиотека для разбора данных

php simple dom - одна из самых популярных библиотек для парсинга (разбора) данны[ на языке PHP. Позволяет быстро и легко разобрать HTML документ и получить нужные данные. Здесь приводится краткий перевод основной документации

Документация php парсинг 

PHP Simple HTML DOM - библиотека парсинга (разбора) данных на PHP. Перевод официальной документации на русский язык.

simple_html_dom.php - файл библиотеки, который необходимо подключить к своему проекту. Например:

include_once('simple_html_dom.php');

Быстрый старт

Получить элементы HTML

// Создать DOM из URL или файла
        $html = file_get_html('http://www.google.com/');

// Найти все изображения
        foreach($html->find('img') as $element)
               echo $element->src . '<br>';

// Найти все ссылки
        foreach($html->find('a') as $element)
            echo $element->href . '<br>';

Изменить элементы HTML

// Создать DOM из строки
        $html = str_get_html('<div id="hello">Привет</div><div id="world">Мир!</div>');

        $html->find('div', 1)->class = 'bar';

        $html->find('div[id=hello]', 0)->innertext = 'foo';

        echo $html; // Вывод: <div id="hello">foo</div><div id="world" class="bar">World</div>
    
 

Извлечь содержимое из HTML

// Дамп содержимого (без тегов) из HTML
        echo file_get_html('http://www.google.com/')->plaintext;
    

Скрапинг Sladshot

// Создать DOM из URL
            $html = file_get_html('http://slashdot.org/');

// Найти все блоки статей по каждому элементу
            foreach($html->find('div.article') as $article) {
                $item['title']     = $article->find('div.title', 0)->plaintext;
                $item['intro']    = $article->find('div.intro', 0)->plaintext;
                $item['details'] = $article->find('div.details', 0)->plaintext;
                $articles[] = $item;
            }

        print_r($articles);
    

Как создать объект HTML DOM

Быстрый способ

// Создать объект DOM из строки
        $html = str_get_html('<html><body>Hello!</body></html>');

// Создать объект DOM из URL
        $html = file_get_html('http://www.google.com/');

// Создать объект DOM из HTML-файла
        $html = file_get_html('test.htm');

Объектно-ориентированный способ

// Создать объект DOM
        $html = new simple_html_dom();

// Загрузить HTML из строки
        $html->load('<html><body>Hello!</body></html>');

// Загрузить HTML с URL-адреса
        $html->load_file('http://www.google.com/');

// Загрузить HTML из файла HTML        
        $html->load_file('test.htm');
    

Как найти элементы HTML

Основы

// Найти все ссылки, возвращает массив объектов элементов
        $ret = $html->find('a');

// Найти (N)-ю ссылку, объект возвращает элемент или нуль , если не найден (с нуля)
        $ret = $html->find('a', 0);

// Найти последнюю ссылку , возвращает объект элемента или нуль , если не найден ( с нуля)
        $ret = $html->find('a', -1);

// Найти все <div> с атрибутом id
        $ret = $html->find('div[id]');

// Найти все <div>, атрибут которых id = foo
        $ret = $html->find('div[id=foo]');
    

Продвинутый

// Найти все элементы, которые id = foo
        $ret = $html->find('#foo');

// Найти все элементы, которые class = foo
        $ret = $html->find('.foo');

// Найти все элементы с ID атрибута
        $ret = $html->find('*[id]');

// Найти все ссылки и изображения
        $ret = $html->find('a, img');

// Находим все ссылки и изображения с атрибутом "title"
        $ret = $html->find('a[title], img[title]');
   

Селекторы потомков

// Находим все <li> в <ul>
        $es = $html->find('ul li');

// Находим вложенные теги <div>
        $es = $html->find('div div div');

// Находим все <td> в <table> which class = hello
        $es = $html->find('table.hello td');

// Находим все теги td с атрибутом align = center в тегах таблиц
        $es = $html->find(''table td[align=center]');
    

Вложенные селекторы

// Находим все <li> в <ul>
        foreach($html->find('ul') as $ul) {
               foreach($ul->find('li') as $li) {
                     // что-то делаем. ..
               }
        }

// Находим первый <li> в первом <ul>
        $e = $html->find('ul', 0)->find('li', 0);

Фильтры атрибутов

Поддерживает эти операторы в селекторах атрибутов:         

Фильтр Описание
[атрибут]    Соответствует элементам , которые имеют указанный атрибут.
[!атрибут] Соответствует элементам, у которых нет указанного атрибута.
[атрибут=значение] Соответствует элементам, имеющим указанный атрибут с определенным значением.
[атрибут!=значение]   Соответствует элементам, не имеющим указанного атрибута, с определенным значением.
[атрибут^=значение] Соответствует элементам, имеющим указанный атрибут, и начинается с определенного значения
[атрибут$=значение] Соответствует элементам, имеющим указанный атрибут, и заканчивается определенным значением.
[атрибут*=значение]   Соответствует элементам с указанным атрибутом и содержит определенное значение.

 

Текст и комментарии

// Находим все текстовые блоки
        $es = $html->find('text');

// Найдите все блоки комментариев (<! --...-->)
        $es = $html->find('comment');

Как получить доступ к атрибутам HTML-элемента

Получить, установить и удалить атрибуты

// Получить атрибут (если атрибут не имеет значения (например, отмечен, выбран ...), он вернет true или false )
        $value = $e->href;

// Установить атрибут (если атрибут не имеет значения (например, отмечен, выбран ...), установить его значение как true или false )
        $e->href = 'my link';

// Удаляем атрибут, устанавливаем его значение как null!
        $e->href = null;

// Определить, существует ли атрибут?
        if(isset($e->href))
                echo 'href exist!';
    

Магические атрибуты

// Пример
        $html = str_get_html("<div>foo <b>bar</b></div>");
        $e = $html->find("div", 0);

        echo $e->tag; // Возвращает: " div "
        echo $e->outertext; // Возвращает: " <div> foo <b>bar</b> </div> "
        echo $e->innertext;  // Возвращает: " foo <b> bar </b> "
        echo $e->plaintext; // Возвращает: "foo bar "

 

Имя атрибута Значение
$e->tag Чтение или запись имени тега элемента.
$e->outertext Чтение или запись внешнего HTML-текста элемента.
$e->innertext Чтение или запись внутреннего HTML-текста элемента.
$e->plaintext Чтение или запись простого текста элемента.    

 

Примеры

// Извлечь содержимое из HTML
        echo $html->plaintext;

// Оборачиваем элемент
        $e->outertext = '<div class="wrap">' . $e->outertext . '<div>';

// Удалить элемент, установив его outertext как пустая строка
        $e->outertext = '';

// Добавляем элемент
        $e->outertext = $e->outertext . '<div>foo<div>';

// Вставить элемент
        $e->outertext = '<div>foo<div>' . $e->outertext;    
    

Как пройти по дереву DOM

Примеры

// Пример
        echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;

// или
        echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');     
    

Методы

Вы также можете вызывать методы с преобразованием имен в camelCase ..
        

Метод Описание
смешанный $e->children ( [int $index] ) Возвращает N-й дочерний объект, если установлен индекс , в противном случае возвращает массив потомков
элемент $e->parent () Возвращает родителя элемента.
элемент $e->first_child () Возвращает первый дочерний элемент элемента или null, если не найден.
элемент $e->last_child ()    Возвращает последний дочерний элемент элемента или null, если не найден.
элемент $e->next_sibling ()   Возвращает следующего родственного элемента или null, если не найден.
элемент $e->prev_sibling ()   Возвращает предыдущий родственный элемент или null, если не найден.

 

Как сбросить содержимое DOM-объекта

Быстрый способ

// Сохраняет внутреннее дерево DOM обратно в строку
        $str = $html;

// Распечатать!
        echo $html;
        

Объектно-ориентированный способ

// Сохраняет внутреннее дерево DOM обратно в строку
        $str = $html->save();

// Сохраняет внутреннее дерево DOM обратно в файл
        $html->save('result.htm');
        

Как настроить поведение парсинга

Функция обратного вызова

// Записываем функцию с параметром " $ element "
        function my_callback($element) {
                 // Скрываем все теги <b>
                if ($element->tag=='b')
                        $element->outertext = '';
        }

// Регистрируем функцию обратного вызова с ее именем
        $html->set_callback('my_callback');

// Функция обратного вызова будет вызвана при выгрузке
        echo $html;     

О сайте

Парсинг данных. Как собирать, извлекать, структурировать и анализировать данные

Соцсети

  1. ВКонтакте
  2. Telegram