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)
我想要的输出是从与页面上的相关联的<a>
标记中获取代码。期望的输出:
Array([0])=>DATA 1 [1]=>12345 [2]=>DATA 2 [3]=> DATA 3)
我认为<a>
会被称为子节点,如果这似乎是一个愚蠢的问题,我对使用 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】:您应该检查td
有a
孩子。使用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 节点和子节点的主要内容,如果未能解决你的问题,请参考以下文章