用简单的HTML DOM解析器

问题描述:

我的HTML代码,更好的方法是代码重复16次:用简单的HTML DOM解析器

<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/>'; 
    } 

代码很慢,有什么变化?

+1

你每扫描一次find()调用的整个dom。找到所有这些div的CONTAINER元素,然后您可以从此处开始扫描。 –

+0

,你能举个例子吗?对不起,这一定是愚蠢 – user2686117

您使用太多的匿名对象来减慢代码速度。这意味着你不会将函数的结果放入一个变量中,而只是“随时随地”使用它。这需要一次又一次地运行你的功能,放慢你的项目。

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

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

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

另一种解决方案是在容器中使用PHP DOM $childNodes,该容器中可找到该项目(或主体元素)。这将返回16个div元素,您可以在中调用<a>元素,然后再为<img>元素调用$ firstChild,以便在其中导航。也许这是你要修改的网站(如添加更多的内容,以结束等)的情况下更加安全

+0

谢谢!你对新代码有什么看法? – user2686117

嘿丹尼尔我改变了代码:

$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/>'; 

    } 

一般正确的方法迭代看起来像这样: