Как получить дерево категорий с помощью PHP Simple HTML DOM Parser

Для получения дерева категорий с использованием PHP Simple HTML DOM Parser необходимо выполнить несколько шагов. Этот процесс включает парсинг HTML-кода, поиск элементов, представляющих категории, и построение иерархической структуры (дерева). Рассмотрим это подробно.

Как получить дерево категорий с помощью PHP Simple HTML DOM Parser

1. Установка PHP Simple HTML DOM Parser

Перед началом работы убедитесь, что вы подключили библиотеку. Вы можете скачать её здесь или установить через Composer:

composer require simplehtmldom/simplehtmldom

Если вы используете Composer, подключите автозагрузчик:

require 'vendor/autoload.php';
use simplehtmldom\HtmlWeb;

2. Анализ структуры HTML

Для успешного парсинга важно понять, как организованы категории в HTML. Обычно категории представлены в виде вложенных списков (<ul> или <ol>) или других элементов с определёнными классами/идентификаторами. Например:

<ul class="categories">
    <li>
        <a href="/category1">Category 1</a>
        <ul>
            <li><a href="/category1/sub1">Subcategory 1.1</a></li>
            <li><a href="/category1/sub2">Subcategory 1.2</a></li>
        </ul>
    </li>
    <li>
        <a href="/category2">Category 2</a>
    </li>
</ul>

Здесь видно, что категории организованы в виде вложенных списков, где каждый <li> содержит ссылку на категорию и, возможно, дочерние элементы.

3. Парсинг HTML и построение дерева категорий

Напишем функцию для рекурсивного обхода вложенных списков и создания дерева категорий.

<?php
require 'vendor/autoload.php';
use simplehtmldom\HtmlWeb;

function parseCategories($element) {
    $categories = [];

    // Находим только непосредственные дочерние элементы <li>
    foreach ($element->children() as $child) {
        if ($child->tag === 'li') { // Проверяем, что это элемент <li>
            // Находим ссылку внутри <li>
            $link = $child->find('a', 0);
            if ($link) {
                $category = [
                    'name' => $link->plaintext,
                    'url'  => $link->href,
                    'children' => []
                ];

                // Проверяем, есть ли вложенные категории (непосредственный дочерний <ul>)
                $nestedUl = $child->find('ul', 0);
                if ($nestedUl) {
                    $category['children'] = parseCategories($nestedUl); // Рекурсивный вызов
                }

                $categories[] = $category;
            }
        }
    }

    return $categories;
}

// Загружаем HTML-страницу
$html = new HtmlWeb();
$dom = $html->load('https://example.com');

// Находим корневой элемент списка категорий
$root = $dom->find('.categories', 0);

if ($root) {
    $tree = parseCategories($root);
    print_r($tree);
} else {
    echo "Категории не найдены.";
}
?>

4. Объяснение кода

  1. Функция parseCategories:
    • Принимает элемент DOM, который содержит список категорий.
    • Для каждого элемента <li> извлекает текст и URL ссылки.
    • Если внутри <li> есть вложенный <ul>, вызывает себя рекурсивно для обработки дочерних категорий.
  2. Рекурсия:
    • Рекурсивный подход позволяет обрабатывать любую глубину вложенности категорий.
  3. Загрузка HTML:
    • Используется метод load для загрузки HTML-страницы.
    • Поиск корневого элемента выполняется с помощью CSS-селектора (например, .categories).
  4. Вывод результата:
    • Дерево категорий выводится в виде массива, где каждая категория содержит название, URL и массив дочерних категорий.

5. Пример вывода

Для приведённого выше HTML результат будет выглядеть так:

Array
(
    [0] => Array
        (
            [name] => Category 1
            [url] => /category1
            [children] => Array
                (
                    [0] => Array
                        (
                            [name] => Subcategory 1.1
                            [url] => /category1/sub1
                            [children] => Array()
                        )
                    [1] => Array
                        (
                            [name] => Subcategory 1.2
                            [url] => /category1/sub2
                            [children] => Array()
                        )
                )
        )
    [1] => Array
        (
            [name] => Category 2
            [url] => /category2
            [children] => Array()
        )
)

6. Важные замечания

  • Ошибки парсинга: Убедитесь, что HTML-код валиден. Некорректная разметка может привести к ошибкам.
  • Производительность: Simple HTML DOM Parser может быть медленным для больших документов. В таких случаях рассмотрите использование более производительных инструментов, таких как DOMDocument или Symfony Crawler.
  • CSS-селекторы: Убедитесь, что используемые селекторы соответствуют структуре целевой страницы.

Ошибки при установке пакета

In PackageDiscoveryTrait.php line 339:

Could not find a version of package simplehtmldom/simplehtmldom matching your minimum-stability (stable). Require it with an explicit version constraint allowing its desired stability.

Ошибка, которую вы видите, связана с настройками minimum-stability в вашем composer.json. По умолчанию Composer использует уровень стабильности stable, что означает, что он будет искать только стабильные версии пакетов. Однако пакет simplehtmldom/simplehtmldom может не иметь стабильной версии (например, только dev-версии или beta).

1. Явное указание версии пакета

Если вы знаете конкретную версию пакета, которую хотите установить, укажите её явно. Например:

composer require simplehtmldom/simplehtmldom:^1.9

Здесь ^1.9 означает, что вы хотите установить самую последнюю версию из ветки 1.9.x.

Если вы не уверены, какая версия доступна, проверьте её на Packagist.

2. Изменение уровня стабильности

Если вы хотите разрешить установку пакетов с более низким уровнем стабильности (например, dev-версий), добавьте параметр --dev или измените настройки в composer.json.

Вариант 1: Установка с явным разрешением нестабильных версий

Вы можете временно разрешить установку нестабильных версий, добавив флаг @dev:

composer require simplehtmldom/simplehtmldom:@dev

Вариант 2: Изменение minimum-stability в composer.json

Откройте файл composer.json вашего проекта и добавьте или измените секцию minimum-stability:

{
    "minimum-stability": "dev",
    "prefer-stable": true
}
  • minimum-stability: "dev" позволяет устанавливать пакеты с любым уровнем стабильности.
  • prefer-stable: true указывает Composer использовать стабильные версии, если они доступны.

После этого выполните команду снова:

composer require simplehtmldom/simplehtmldom

3. Проверка доступных версий

Если вы не уверены, какие версии пакета доступны, выполните следующую команду:

composer show simplehtmldom/simplehtmldom --all

Это покажет все доступные версии пакета, включая их стабильность (например, dev-master, beta, stable).

4. Альтернативный подход: Установка без Composer

Если вы не хотите использовать Composer, вы можете скачать библиотеку напрямую с официального сайта или из репозитория GitHub. Затем подключите её вручную:

require 'path/to/simple_html_dom.php';

Однако использование Composer предпочтительнее, так как оно обеспечивает удобное управление зависимостями.

Итог

Наиболее простым решением является явное указание версии пакета:

composer require simplehtmldom/simplehtmldom:^1.9

Если это не помогает, измените уровень стабильности в composer.json или используйте флаг @dev.

Теги:  PHP, Simple HTML DOM Parser, парсинг HTML, дерево категорий, иерархическая структура

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack на основе готовой верстки

* если нет верстки, то возможность верстать с Figma в режиме редактора