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 :: Помогите разобраться с Symfony\DomCrawler и XPath

 PHP.SU

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


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

> Без описания
nkl
Отправлено: 12 Марта, 2015 - 07:41:03
Post Id



Посетитель


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


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




Доброго времени суток, коллеги! Со вчерашнего дня разбираюсь с этим икспасом. Хм

Я так понимаю, что симфонивский The DomCrawler Component - это ни что иное, как обертка над \DomDocument() и \DomXPath(), следовательно, кто знает эти либы, тот сможет мне помочь.

Поставил значит консольку для FireBag'а - FirePath (оч. удобная штука кстати, советую). Для примера взял одну из своих страничек. Пробую делать XPath-запросы. Получение одного элемента - не проблема, а вот получение массива элементов которые подпадают под один запрос - это да, это вертяк. Вот мой XPath-запрос:
PHP:
скопировать код в буфер обмена
  1. $elements = $crawler->filterXPath("html/body/div[2]/header/div/div[2]/ul/li");

Там в списке 11 итемов li, в $elements как положенно оказывается такой массив:
Спойлер (Отобразить)

Но, когда я пытаюсь перебрать его в цикле:
PHP:
скопировать код в буфер обмена
  1. foreach($elements as $domElemet){
  2.                 dump($domElemet->attr('class'));
  3.        }

Сифони выбрасывает такой эксепшен:
Цитата:
[Symfony\Component\Debug\Exception\UndefinedMethodException]
Attempted to call method "attr" on class "DOMElement".

А этот метод:

и вовсе возвращает 0. В офф документации в первом же примере указано, что nodeName - это атрибут экземпляра класса $domElement, а чуть ниже он приводиться уже как метод $domElement->nodeName(). Если обратиться к свойству nodeName то возвращает как положено 11 раз "li", в общем я ничего не пойму, каша какая-то в голове.

Что я делаю не так? Огорчение
(Добавление)
Все разобрался, там в документации чуть ниже есть такой метод (анонимная функция):
PHP:
скопировать код в буфер обмена
  1. $nodeValues = $crawler->filter('p')->each(function (Crawler $node, $i) {
  2.     return $node->text();
  3. });

Это работает! Я получил нужный мне текст.

(Отредактировано автором: 12 Марта, 2015 - 07:42:47)

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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB