Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: HTML-парсер

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: HTML-парсер с использованием xPath запросов и пользовательских фильтров.
armancho7777777 Супермодератор
Отправлено: 09 Ноября, 2013 - 19:51:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Реализация (Отобразить)

Примеры: (Отобразить)

Свойства для чтения:
text - текст внутри элемента
html - html внутри элемента
attrList - массив атрибутов элемента
className - значение атрибута 'class'
classList - массив css-классов элемента
data - объект типа stdClass, содержащий данные атрибутов "data-*".
И сам элемент: $item->__toString()

Атрибута доступны так же в виде свойств.

Элементы возвращаемых массивов являются объектами типа parseElement, наследника класса DOMElement.

Можно расширить возможности класса DOMXPath путём наследования (или агрегации, если значения аргумента(ов) конструкторов отличаются), добавив метод cssQuery, реализовав для этого простейший конвертер css-селекторов в xPath-оси, или же воспользоваться классом Css2Xpath из пакета Zend\Dom\Query.

(Отредактировано автором: 16 Октября, 2015 - 16:07:48)

 
 Top
armancho7777777 Супермодератор
Отправлено: 09 Ноября, 2013 - 22:15:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Файл -->>
Скачать файл: parseHtml.php
Скачан раз: 84

(Отредактировано автором: 18 Января, 2014 - 13:05:13)

 
 Top
bombording
Отправлено: 22 Ноября, 2013 - 11:14:14
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




armancho7777777
Сейчас тестирую Ваш скрипт.

Как можно разбить table tr на td элементы?

CODE (html):
скопировать код в буфер обмена
  1. <table>
  2. <tr><td></td><td></td><td></td><td></td><td></td></tr>
  3. <tr><td></td><td></td><td></td><td></td><td></td></tr>
  4. ...
  5. <tr><td></td><td></td><td></td><td></td><td></td></tr>
  6. <tr><td></td><td></td><td></td><td></td><td></td></tr>
  7. </table>
  8.  

Пробую:

PHP:
скопировать код в буфер обмена
  1. $result = parseHtml($html)->xPath('//tr//td');
  2.  
  3. foreach($result as $item)
  4. {
  5.     echo $item->text, '<br>';
  6. }
  7.  


Но выводится каждый td.
А мне необходимо создать массив из td элементов каждого tr.
 
 Top
armancho7777777 Супермодератор
Отправлено: 22 Ноября, 2013 - 11:58:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Решение похожей задачи реализовано во втором примере.
Метод xPath возвращает массив объектов элементов DOM, у которых тоже есть метод xPath.
PHP:
скопировать код в буфер обмена
  1. $trs = parseHtml($html)->xPath('//tr');
  2.  
  3. foreach($trs as $index => $tr) {
  4.     $trs[$index] = $tr->xPath('./td');
  5. }
  6.  
  7. print_r($trs);


Можно так ещё:
PHP:
скопировать код в буфер обмена
  1. $result = array_map(
  2.     function($tr) {
  3.         return $tr->xPath('./td');
  4.     },
  5.     parseHtml($html)->xPath('//tr')
  6. );
  7.    
  8. print_r($result);


Если надо перевести значения массива в html-строку, то добавьте это:
PHP:
скопировать код в буфер обмена
  1. array_walk_recursive($result, function(&$item){
  2.     $item = $item->__toString();
  3.     // Или $item = $item->html;
  4.     // Или $item = $item->text;
  5. });

(Отредактировано автором: 22 Ноября, 2013 - 14:43:51)

 
 Top
bombording
Отправлено: 22 Ноября, 2013 - 13:40:48
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




armancho7777777
Получилось. Здорово, скрипт выполняется около 4 секунд... аналогичный парсер DOM делал это 130 секунд.
Спасибо!

А можно, используя код ниже, загонять в массив данные без html... обычный текст.
Или все же нужно использовать strip_tags() после?

PHP:
скопировать код в буфер обмена
  1. $result = array_map(
  2.     function($tr) {
  3.         return $tr->xPath('./td');
  4.     },
  5.     parseHtml($html)->xPath('//tr')
  6. );
 
 Top
armancho7777777 Супермодератор
Отправлено: 22 Ноября, 2013 - 14:20:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




bombording пишет:
А можно, используя код ниже, загонять в массив данные без html... обычный текст.

Да. Вы не внимательны. Хотя разобрав примеры из первого поста Вы бы поняли.
Разберите уже их, а не просто копируйте.
Ещё пример:
PHP:
скопировать код в буфер обмена
  1.  
  2. $result = array_map(
  3.     function($tr) {
  4.         return array_map(
  5.             function($td) {
  6.                 return $td->html; // Или $td->text;
  7.             },
  8.             $tr->xPath('./td')
  9.         );
  10.     },
  11.     parseHtml($html)->xPath('//tr')
  12. );
  13.  
  14. print_r($result);
  15.  


armancho7777777 пишет:
Метод xPath возвращает массив объектов элементов DOM, у которых тоже есть метод xPath.

Так как объекты являются наследниками класса DOMElement, то соотвественно наследуют все его методы и свойства.

P.S.
bombording пишет:
скрипт выполняется около 4 секунд

Чисто сам парсер съест доли секунд на небольшом документе.

(Отредактировано автором: 18 Января, 2014 - 12:15:12)

 
 Top
GaramGor
Отправлено: 29 Октября, 2016 - 13:16:36
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Окт. 2016  


Помог: 0 раз(а)




файл не скачивается. Дайте, пожалуйста, ссылку на файл.
 
 Top
armancho7777777 Супермодератор
Отправлено: 29 Октября, 2016 - 16:37:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Код есть и в спойлере первого поста.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB