使用PHP Simple Html Dom获取不同类型的上一个元素?

时间:2012-03-11 21:40:59

标签: php dom screen-scraping scrape

希望通过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>

对于我需要找到并抓住第一个H5的每个IMG,我认为。没有父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简单做什么HTML Dom。我希望如此,我试过的所有其他刮刀都让我把头发拉出来。

2 个答案:

答案 0 :(得分:2)

是的,因为您没有将整个页面作为dom加载,所以您实际拥有的是DOMElement列表,而前一个子项将为NULL。

不是先前找到,你基本上可以做的是,有一个移动指针

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

有一些sedo代码,但你会得到我的意思。

答案 1 :(得分:1)

基本上,您要选择所有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;
}