PHP DOM 遍历 HTML 节点和子节点

Posted

技术标签:

【中文标题】PHP DOM 遍历 HTML 节点和子节点【英文标题】:PHP DOM traverse HTML nodes and childnode 【发布时间】:2017-09-18 11:18:49 【问题描述】:

我正在使用一些代码从 html 页面中挑选出所有 <td> 标记:

$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('td') as $node) 
$array_data[ ] = $node->nodeValue;

这会将数据很好地存储在我的数组中。

正在查看的html数据是:

<tr>
<td>DATA 1</td>
<td><a href="12345">DATA 2</a></td>
<td>DATA 3</td> 
</tr>

$array_data 返回:

Array([0])=>DATA 1 [1]=>DATA 2 [2]=> DATA 3)

我想要的输出是从与页面上的相关联的&lt;a&gt; 标记中获取代码。期望的输出:

Array([0])=&gt;DATA 1 [1]=&gt;12345 [2]=&gt;DATA 2 [3]=&gt; DATA 3)

我认为&lt;a&gt; 会被称为子节点,如果这似乎是一个愚蠢的问题,我对使用 DOM 很抱歉。

我已阅读 SO 链接: Using php dom to get child elements

我已使用此代码来选择 href:

   foreach ($dom->getElementsByTagName('td') as $node) 
      foreach ($node->getElementsByTagName('a') as $node)
      $link = $node->getAttribute('href');
      echo '<br>';
      echo $link;
      
      $array_data[ ] = $node->nodeValue;
   

对于其他阅读材料的任何帮助或指示将不胜感激! 谢谢

【问题讨论】:

我发布了解决您问题的答案。那你为什么改变问题?你有什么问题? 感谢您的解决方案 Mohammed。我正在阅读其他 SO 帖子以同时找到解决方案。一旦我在 SO 帖子上找到了一些东西,我就在我的问题中发布了更新的代码。 【参考方案1】:

您应该检查tda 孩子。使用getElementsByTagName() 选择锚标记并使用length 属性检查选择是否包含内容。如果td在child中有anchor,使用getAttribute()获取它的href属性。

$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('td') as $node) 
    $nodeAnchor = $node->getElementsByTagName("a");
    if ($nodeAnchor->length)
        $array_data[] = $nodeAnchor->item(0)->getAttribute("href");
    $array_data[] = $node->nodeValue;

见demo

【讨论】:

以上是关于PHP DOM 遍历 HTML 节点和子节点的主要内容,如果未能解决你的问题,请参考以下文章

jQuery DOM节点操作 - 父节点子节点兄弟节点

计算特定XML节点c#的子节点数[重复]

js DOM知识总结

Js DOM对象

html 在dom中遍历叶节点

ztree获取当前选中节点子节点id集合的方法(转载)