Недостатки simple_html_dom или парсинг сложных страниц

Я уже писал о библиотеке simple_html_dom, с помощью которой можно парсить страницы сайтов. В этой заметке поделюсь некоторыми наработками, когда содержимое имеет одинаковые контейнеры.

Что делать когда сложно зацепиться за DOM элементы?

По неизвестной мне причине в библиотеке simple_html_dom не работает несколько классов в html элементе. Например, не получится найти и сделать выборку по строке:

Очевидным будет использовать конструкции вроде:

или

но на деле это не работает или почти никогда не работает.

Описание задачи

Задача следующая:

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

Сначала preg_match потом simple_html_dom

Для этих целей можно было бы использовать сначала конструкции preg_match, чтобы найти определённое содержимое страницы:

Код выше схватит всё что начинается с «Первого заголовка» и до «второго заголовка».

Иногда приходится так изощрять код, потому что иначе не захватить точный кусок кода. В базовых примерах php часто даются простые и типовые ситуации, которые не работают в сложных случаях.

А вот ещё один код:

С помощью него мы уже захватим всё что после второго заголовка.

А потом уже из найденного использовать выборку

Но здесь возникает другая проблема. Содержимое в переменной matches отказывается пониматься и выводит разного рода ошибки. Даже, если содержимое конвертировать в массивы или строки, всё равно чего-то не хватает. А что именно, совсем не ясно.

Хотя в обратную сторону работает. Если сначала сделать выборку через simple_html_dom, то потом можно вполне забирать информацию через preg_match.

В ином случае остаётся придерживаться одного стиля, либо использовать только preg_match либо simple_html_dom. В данной статье будем использовать только второе.

Только simple_html_dom

Если перед парсингом нужно удалить какие-то данные, воспользуйтесь этой статьёй.

В коде уже привел все пояснения. Первый блок находим так.

В результате этих манипуляций мы получим массив $our_array, в котором будет содержаться такая информация:

И так 5 строк в массиве. Дальше с этим массив можно делать всё что угодно.

Но задача ещё не закончена. Помните, выше я говорил о втором блоке, который тоже нужно найти? Проблема в том, что он имеет одинаковые свойства с первым блоком, который нам не надо никак захватывать.

Предположим что первый блок меняется и содержит всегда разное количество информации. И не получится это обойти используя наш первый массив, начиная например с 6-ого значения: our_array[5]. Ведь в другой раз, на другой странице, нужные нам данные могут начинаться с третьей позиции или любой другой.

Мы знаем, что второй блок, к счастью начинается сразу за первым. Или любым другим, но идёт всегда в одинаковом порядке. В приведенном примере всегда после первого блока. Тогда добавляем следующую конструкцию:

Как видно, содержимое второго php блока повторяет первый, за исключением того, что мы находим первый блок и пропускаем его с помощью конструкции if($i==1) continue. И обязательно останавливаем наш поиск на втором блоке. Иначе схватится лишнее. Одинаковых контейнеров может быть очень много.

Добавить комментарий

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи: "Недостатки simple_html_dom или парсинг сложных страниц".

Ваш e-mail не будет опубликован. Обязательные поля помечены *