用简单的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/>';
}
代码很慢,有什么变化?
答
您使用太多的匿名对象来减慢代码速度。这意味着你不会将函数的结果放入一个变量中,而只是“随时随地”使用它。这需要一次又一次地运行你的功能,放慢你的项目。
因为你可以使用函数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/>';
}
答
一般正确的方法迭代看起来像这样:
你每扫描一次find()调用的整个dom。找到所有这些div的CONTAINER元素,然后您可以从此处开始扫描。 –
,你能举个例子吗?对不起,这一定是愚蠢 – user2686117