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

问题描述 投票:0回答:2

希望这可以通过 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 。 我希望如此,我尝试过的所有其他刮刀都让我把头发拔掉。

php web-scraping dom
2个回答
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
投票

本质上,您想要选择所有

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.