在php中按属性值获取HTML元素

时间:2011-12-06 04:58:03

标签: php html dom

我需要用php从网页中提取一些数据。我感兴趣的部分与此类似:

<a href="somepath" target="fruit">apple</a>
<a href="somepath" target="animal">cat</a>
<a href="somepath" target="fruit">orange</a>
<a href="somepath" target="animal">dog</a>
<a href="somepath" target="fruit">mango</a>
<a href="somepath" target="animal">monkey</a>

首先,我想要提取所有水果,然后提取所有动物,以便我将它们很好地分组。

我想出了如何遍历所有属性值。这是代码:

$dom = new DOMDocument();
$html = file_get_contents('example.html');

@$dom->loadHTML($html);

$a = $dom->getElementsByTagName('a');

for ($i; $i < $a->length; $i++) {
$attr = $a->item($i)->getAttribute('target');

echo $attr . "\n";
}

所以我得到了:

fruit animal fruit animal fruit animal

我还发现了如何获取元素的文本内容:

$a->item($i)->textContent

所以,如果包含在循环中并回显,我得到:

apple cat orange dog mango monkey

我觉得我非常接近,但我无法得到我想要的东西。我需要这样的东西:

if(target =“fruit”)然后给我“苹果,橘子,芒果”。

有人可以指出我正确的方向吗?

感谢。

3 个答案:

答案 0 :(得分:17)

continue targetfruit个属性textContent,然后将$nodes = array(); for ($i; $i < $a->length; $i++) { $attr = $a->item($i)->getAttribute('target'); if ($attr != 'fruit') { continue; } $nodes[] = $a->item($i)->textContent; } 个元素添加到数组中。

$nodes

target现在包含将fruit属性设置为{{1}}的元素的所有节点。

答案 1 :(得分:11)

使用DOMXPath并查询:

$doc = new DOMDocument();
$doc->Load('yourFile.html');

$xpath = new DOMXPath($doc);

$fruits = $xpath->query("//a[@target='fruit']");
foreach($fruits as $fruit) {
    // ...
}

$animals = $xpath->query("//a[@target='animal']");
foreach($animals as $animal) {
    // ...
}

请参阅this演示。

答案 2 :(得分:3)

制作两个数组

$fruits=array();
$animals=array();

吨 当你得到时,我会在循环中。

if(target=='fruit') {
   array_push($fruits,$valueofelement);

} else if ($target=='animal') {
   array_push($animals,$valueofelement);
}