简单HTML Dom解析器的更好方法


better way with Simple HTML Dom Parser

我的HTML代码是代码重复16次:

<div class="headline_image">
<a ga-cat="slideshow-view" ga-action="view-1" href="mylink"><img src="http://dd4994.jpg" width="420" height="323" align="right" alt="my text "/></a>
</div>

我想得到所有的imgs链接和文本也href我做了什么:

for ($x = 0; $x <=  15; $x++) {
$imglink = $html->find('div[class=headline_image] img', $x)->getAttribute('src');
$mytext = $html->find('div[class=headline_image] img', $x)->getAttribute('alt');
$postlink = $html->find('div[class=headline_image] a', $x)->getAttribute('href');
  echo '<br/>';
    echo $mytext;
     echo '<br/>';
    print_r($postlink);
    echo '<br/>';
    }

代码很慢,有什么变化吗?

使用过多的匿名对象会降低代码的速度。这意味着您不将函数的结果放入变量中,而只是在"动态"中使用它。这需要一次又一次地运行您的函数,从而降低您的项目速度。

因为您可以使用函数find来返回数组,所以我建议您在for循环之前这样做。

$imgarray = $html->find('div[class=headline_image] img', $x);

通过这种方式,$html->find只运行一次,而不是十六次。在for循环中,您可以将其用作数组并处理结果:$imgarray[$x]。你对$anchorarray做了同样的处理,你的代码就会加快,你会看到的。

另一种解决方案是在可以找到这16项的容器(或body元素)上使用PHP DOM $childNodes。这将返回十六个div元素,您可以通过为<a>元素调用$firstChild和为<img>元素再次调用$firstChild来导航这些元素。如果你想对网站进行更改(比如在末尾添加更多内容等),这可能更安全。

嘿Daniel我把代码改成了:

    $imgarray = $html->find('div[class=headline_image] img');
$linkarray = $html->find('div[class=headline_image] a');
for ($x = 0; $x <=  15; $x++) {
 echo $imgarray[$x]->getAttribute('src');
   echo '<br/>';
  echo $imgarray[$x]->getAttribute('alt');
     echo '<br/>';
   echo $linkarray[$x]->getAttribute('href');
  echo '<br/>';
    }

通常,正确的迭代方式如下所示:

foreach($html->find('div') as $div){
  echo $div;
}