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
Форумы портала PHP.SU :: Версия для печати :: HTML-парсер
Форумы портала PHP.SU » PHP » Пользовательские функции » HTML-парсер

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

1. armancho7777777 - 09 Ноября, 2013 - 19:51:58 - перейти к сообщению
Реализация (Отобразить)

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

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

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

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

Можно расширить возможности класса DOMXPath путём наследования (или агрегации, если значения аргумента(ов) конструкторов отличаются), добавив метод cssQuery, реализовав для этого простейший конвертер css-селекторов в xPath-оси, или же воспользоваться классом Css2Xpath из пакета Zend\Dom\Query.
2. armancho7777777 - 09 Ноября, 2013 - 22:15:02 - перейти к сообщению
Файл -->>
3. bombording - 22 Ноября, 2013 - 11:14:14 - перейти к сообщению
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.
4. armancho7777777 - 22 Ноября, 2013 - 11:58:00 - перейти к сообщению
Решение похожей задачи реализовано во втором примере.
Метод 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. });
5. bombording - 22 Ноября, 2013 - 13:40:48 - перейти к сообщению
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. );
6. armancho7777777 - 22 Ноября, 2013 - 14:20:01 - перейти к сообщению
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 секунд

Чисто сам парсер съест доли секунд на небольшом документе.
7. GaramGor - 29 Октября, 2016 - 13:16:36 - перейти к сообщению
файл не скачивается. Дайте, пожалуйста, ссылку на файл.
8. armancho7777777 - 29 Октября, 2016 - 16:37:09 - перейти к сообщению
Код есть и в спойлере первого поста.

 

Powered by ExBB FM 1.0 RC1