获取所有itemprop和itemprop深度

时间:2016-12-16 14:16:32

标签: php xpath domdocument domxpath

我有这个代码并且它或多或少有效,问题是它们中的一些是空的并且在数组中的位置错误,而内部提供了其他3个迭代。

我不想硬编码,因为我会在多个网站上使用它。

function get_product_itemprop($url){
$url = file_get_contents($url);
$d = new DOMDocument();
$d->loadHTML($url);
$xpath = new DOMXPath($d);
$nodes = $xpath->query('//*[@itemprop]'); 

$new_data = array();
foreach ($nodes as $node) { 
    $new_data[$node->getAttribute("itemprop")] = trim(preg_replace('/\s+/', ' ',$node->nodeValue));
}
return $new_data;

}

功能结果

    array(8) {
  ["breadcrumb"]=>
  string(38) "Home Atomizers & Coils Amor Mini coils"
  ["name"]=>
  string(15) "Amor Mini coils"
  ["sku"]=>
  string(5) "CO815"
  ["offers"]=>
  string(8) "$ 13.99"
  ["price"]=>
  string(0) ""
  ["priceCurrency"]=>
  string(0) ""
  ["availability"]=>
  string(0) ""
  ["url"]=>
  string(0) ""
  }

On http://search.google.com/structured-data/testing-tool我得到了所有的itemprops,我想要一个类似的结构,但他们需要一个数组:

http://imgur.com/KbNRvnG

1 个答案:

答案 0 :(得分:0)

您可以迭代attributes属性:

foreach ($nodes as $node) {
    foreach ($node->attributes as $attr) {
        $new_data[$attr->nodeName] []= $attr->nodeValue;
    }
}

实施例

$html = <<<'HTML'
<html>
    <body>
        <div itemprop="10" a="20" b="30"></div>
        <div itemprop="40" a="50" z="60"></div>
    </body>
</html>
HTML;

$d = new DOMDocument;
$d->loadHTML($html);
$xpath = new DOMXpath($d);
$nodes = $xpath->query('//*[@itemprop]');


$new_data = [];
foreach ($nodes as $node) {
    foreach ($node->attributes as $attr) {
        $new_data[$attr->nodeName] []= $attr->nodeValue;
    }
}
var_dump($new_data);

输出

array(4) {
  ["itemprop"]=>
  array(2) {
    [0]=>
    string(2) "10"
    [1]=>
    string(2) "40"
  }
  ["a"]=>
  array(2) {
    [0]=>
    string(2) "20"
    [1]=>
    string(2) "50"
  }
  ["b"]=>
  array(1) {
    [0]=>
    string(2) "30"
  }
  ["z"]=>
  array(1) {
    [0]=>
    string(2) "60"
  }
}

示例代码获取文档中具有itemprop属性的所有元素。如果要获取具有属性的所有元素,请使用@*,例如//*[@*]