捕获空白节点DOM并分配值

时间:2014-10-21 13:36:09

标签: php html xpath scrape

好的,我是DOM的新手,但到目前为止,我已经成功地拼凑了一个半工作的解决方案。

使用xpath我正在寻找网页中的关键元素,并循环遍历每个实例,这很好,直到我到达一个空的节点。

所以在构建我的数组时,我已经说过一个元素的20个节点但只有14个节点,因为img并不是一直存在的。

所以实际上我有一个看起来像这样的数组

Array
(
[0] => Array
    (
        [item] => PV10923
        [img] => image1.jpg
    )

[1] => Array
    (
        [item] => PV10924
        [img] => image2.jpg
    )

[2] => Array
    (
        [item] => PV10925
        [img] => image3.jpg
    )

[3] => Array
    (
        [item] => PV10926
        [img] => image4.jpg
    )

[4] => Array
    (
        [item] => PV10927
        [img] => 
    )

[5] => Array
    (
        [item] => PV10928
        [img] => 
    )

[6] => Array
    (
        [item] => PV10929
        [img] => 
    )

)

实际上它应该看起来像这样

    Array
   (
[0] => Array
    (
        [item] => PV10923
        [img] => image1.jpg
    )

[1] => Array
    (
        [item] => PV10924
        [img] => image2.jpg
    )

[2] => Array
    (
        [item] => PV10925
        [img] =>  
    )

[3] => Array
    (
        [item] => PV10926
        [img] =>  
    )

[4] => Array
    (
        [item] => PV10927
        [img] => 
    )

[5] => Array
    (
        [item] => PV10928
        [img] => image3.jpg
    )

[6] => Array
    (
        [item] => PV10929
        [img] => Image4.jpg
    )

  )

现在网页源代码看起来像这样

<div id="item">
<h2>PV PV10924</h2>
<p>
<a href="http://www.example.com"><img src="image4.jpg">
</p>
</div>
<div id="item">
<h2>PV PV10925</h2>
<p>
&nbsp; (assign a value)
</p>
</div>
<div id="item">
<h2>PV PV10926</h2>
<p>
<a href="http://www.example.com"><img src="image5.jpg">
 </p>
 </div>

我一直在寻找是否有办法捕获父级然后执行if语句以查看子级是否存在然后执行xpath如果不分配节点值x

阅读诵读困难不是我的强项,但相信我,我正在努力......

任何人都可以告诉我有关实现这一目标的最佳途径/方法....

1 个答案:

答案 0 :(得分:0)

您可以检查特定元素的后代。例如:

$sample_markup = '<div id="item"><h2>PV PV10924</h2><p><a href="http://www.example.com"><img src="image4.jpg"></a></p></div><div id="item"><h2>PV PV10925</h2><p>&nbsp; (assign a value)</p></div><div id="item"><h2>PV PV10926</h2><p><a href="http://www.example.com"><img src="image5.jpg"></a> </p> </div>';
// using the sample markup above
$dom = new DOMDocument();
libxml_use_internal_errors(true); // handle errors
$dom->loadHTML($sample_markup);
libxml_clear_errors();
$xpath = new DOMXpath($dom);

$data = array();
$elements = $xpath->query('//div[@id="item"]');
foreach($elements as $e) {
    $item = $xpath->evaluate('string(.//h2/text())', $e);
    // checking
    $check = $xpath->evaluate('count(.//*[descendant::a])', $e);
    if($check > 0) {
        $image = $xpath->evaluate('string(.//a/img/@src)', $e);
    } else {
        $image = 'test.jpg';
    }
    $data[] = array('item' => $item, 'image' => $image);
}

echo '<pre>';
print_r($data);

Sample Output