【问题标题】:Capture Blank Nodes DOM and assign value捕获空白节点 DOM 并赋值
【发布时间】:2014-10-21 13:36:08
【问题描述】:

好吧,我对 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

阅读障碍不是我的强项,但相信我,我正在努力……

谁能告诉我实现这一目标的最佳路线/方法....

【问题讨论】:

  • 所以你想检查&lt;div id="item"&gt;里面是否有一个带有img的anchor的孩子?这真的是标记吗?它具有相同的多个 id,这没有意义
  • 是本质上是的,如果
    有一个有效的子元素,那么通过 if 语句执行捕获,否则将分配一个默认值,以便构建数组以匹配网页。我相信您在下面的 sn-p 将不仅仅是通过查看它来测试它来解决问题。我以前没有见过“评估”功能,所以我还要阅读一些关于保持大脑专注所需的咖啡。
  • 是的,你可以测试它。就像名称本身一样评估 xpath 查询。很高兴这有帮助

标签: php html xpath scrape


【解决方案1】:

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

$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

【讨论】:

  • 由于我正在使用一个类,所以我必须做一个小的调整,所以我必须在类中包含评估方法,所以我用我的 for 函数运行你的 foreach,然后将你的 foreach 数组添加到我的 for 和它匹配得很好。
猜你喜欢
相关资源
最近更新 更多
热门标签