Как объединить текстовый узел из 2 фрагментов извлеченных данных с помощью Goutte/Domcrawler

Я пытался понять, как объединить два фрагмента извлеченного текста в один результат (массив). В данном случае название и подзаголовок различных книг.

<td class="item_info">
  <span class="item_title">Carrots Like Peas</span>
  <em class="item_subtitle">- And Other Fun Facts</em>
</td>

Самое близкое, что я смог получить, это:

$holds = $crawler->filter('span.item_title,em.item_subtitle');

Что мне удалось вывести со следующим:

$holds->each(function ($node) {
    echo '<pre>';
    print $node->text();
    echo '</pre>';
});

И приводит к

<pre>Carrots Like Peas</pre>
<pre>- And Other Fun Facts</pre>

Другая проблема заключается в том, что не все книги имеют субтитры, поэтому мне нужно избегать объединения двух заголовков вместе. Как мне объединить эти два в один результат (или массив)?


person Fireflight    schedule 28.01.2016    source источник


Ответы (2)


В моем случае я пошел окольным путем, чтобы добраться туда, где я хотел быть. Я отступил на один уровень в DOM к тегу td, взял все и свалил в массив.

Я понял, что в документации DomCrawler есть пример кода для размещения текстовых узлов в массиве.

$items_out = $crawler->filter('td.item_info')->each(function (Crawler $node, $i) {
    return $node->text();   
});

Я старался не записывать td, потому что авторы также были включены в эти ячейки. После еще большего копания я смог удалить авторов из массива следующим образом:

foreach ($items_out as &$items) {
    $items = substr($items,0, strpos($items,' - by'));
}

Мне понадобилось пять дней, чтобы все уладить. Теперь о следующей проблеме!

person Fireflight    schedule 03.02.2016

Согласно документации Goutte, Goutte использует компонент Symfony DomCrawler. Информацию о добавлении содержимого в объект DomCrawler можно найти по адресуSymfony DomCrawler — Добавление контента

person Shaun Bramley    schedule 02.02.2016