Получить предыдущий элемент другого типа с помощью PHP Simple Html Dom? - PullRequest
1 голос
/ 12 марта 2012

Надеюсь, что это возможно с Simple Html Dom, я очищаю страницу, которая выглядит следующим образом:

<h5>this is title 1</h5>
<img>
<img>
<img>

<h5>this is title 2</h5>
<img>
<img>

<h5>this is title 3</h5>
<img>
<img>
<img>
<img>

и т.д ...

Я пытаюсь заставить его выглядеть примерно так:

<h5>this is title 1</h5>
<img>
<h5>this is title 1</h5>
<img>
<h5>this is title 1</h5>
<img>


<h5>this is title 2</h5>
<img>
<h5>this is title 2</h5>
<img>

Что означает для каждого IMG, что мне нужно найти и взять первый предыдущий H5, я думаю. Там нет родительских элементов div или какой-либо структуры, чтобы сделать это проще, я описал это в значительной степени.

Код, который я использую, выглядит примерно так (упрощенно):

foreach($html->find('img') as $image){

//do stuff to the img

$title = $html->find('h5')->prev_sibling();


echo $title; echo $image;}

Все, что я пробовал с prev_sibling, дает мне «фатальную ошибку: вызов функции-члена prev_sibling () для необъекта», и мне интересно, возможно ли то, что я пытаюсь сделать, с помощью PHP Simple HTML Dom. Надеюсь, что все другие скребки, которые я пробовал, заставляли меня вырывать волосы.

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

Да, поскольку вы не загружаете всю страницу как dom, у вас по существу есть список DOMElement, а предыдущий дочерний элемент будет равен NULL.

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

$all = get all elements,
$title = null;
foreach ($all as $e) {
  if ($e == "h5") {
    $title = $e;
    continue;
  }
  echo $title . $e;
}

Есть некоторый код sedo, но вы поймете, что я имею в виду.

1 голос
/ 12 марта 2012

По сути, вы хотите выбрать все элементы h5, а также все элементы img.Затем вы просматриваете их и проверяете их тип.Если это элемент h5, вы обновляете переменную $title, но ничего не echo.Если это img, вы просто повторяете $title перед изображением.Не нужно охотиться за h5 сейчас, так как вы уже его кэшировали.

Вот пример:

foreach ( $html->find('h5, img') as $el )
{
    if ( $el->tag == 'h5' )
    {
        $title = $el->plaintext;
        continue;
    }

    echo "<h5>$title</h5>";
    echo $el->outertext;
}
...