php DOM 获取属性

标签 php dom html-parsing domdocument getattribute

好吧,我这里有一个奇怪的案例,我就是想不通。

我想解析网站上的列表。 HTML 看起来有点像这样:

<!-- ... -->
<ul id="foo">
    <li data-text="item 1">Blabla</li>
    <li data-text="item 2">Blabla</li>
    <li data-text="item 3">Blabla</li>
    <li data-text="item 4">Blabla</li>
</ul>
<!-- ... -->

现在我想抓取所有列表项。为此,我使用 DOMDocument 类。到目前为止,一切正常:

$dom = new DOMDocument();

if (!$dom->loadHTML($html)) {
    die ('Could not parse...');
}

$list = $dom->getElementById('foo');
$items = $list->childNodes;
foreach ($items as $item) {
     print_r($item);
}

但是现在,我正在寻找一种简单的方法来读取data-text 属性。我所做的是:

foreach ($items as $item) {
     echo $item->getAttribute('data-text');
}

这对第一个项目工作得很好,但随后它使 foreach 循环崩溃。输出是:

item 1
Fatal error: Call to undefined method DOMText::getAttribute() in example.php on line 44

我在这里没有明白调用 getAttribute 方法如何更改 foreach 循环的上下文。所以这里有两个问题:

  1. 调用该方法如何搞砸我的 foreach 循环?第二, 最优雅的解决方法是什么?
  2. 我意识到我可以循环访问 $item->attributes with 另一个 foreach 方法,然后将属性名称与 data-text 进行比较, 在匹配的情况下读取值,但肯定必须有一个 更好的方法?!

最佳答案

问题是 ul 将文本节点作为子节点,而 li 的文本节点没有属性,因此会出现错误。在尝试访问其属性之前,只需测试子节点是否为元素节点

foreach ($items as $item) {
         if ($item->nodeType == XML_ELEMENT_NODE)
         echo $item->getAttribute('data-text');
}

您还可以使用 getElementsByTagName() , 尽管如果您有嵌套列表,它们中的 li 也会被选中。

$items = $list->getElementsByTagName('li');
foreach ($items as $item) {
    echo $item->getAttribute('data-text');
}

关于php DOM 获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14571904/

相关文章:

php - 添加额外字段 - Wordpress(wp_insert_user 和 update_user_meta 不起作用)

PHP MySQL : Select from same table multiple times without database load for each query?

javascript - 使用 jQuery forEach 查找发生原始点击的 <p>

php - 使用php上传文件

php - 服务器端集群谷歌地图标记

javascript - 在 jQuery 中查找下一个元素

javascript - 更健壮的 jQuery :hidden implementation

xpath - 处理 selenium webdriver 中的重复 ID

Python漂亮的汤表单输入解析

php - 使用 DOMDocument,是否可以获取某个 DOM 中存在的所有元素?