cla*_*vdb 6 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>
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)
现在我想抓住所有列表项.我使用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);
}
Run Code Online (Sandbox Code Playgroud)
但现在,我正在寻找一种简单的方法来读出data-text属性.我做的是:
foreach ($items as $item) {
echo $item->getAttribute('data-text');
}
Run Code Online (Sandbox Code Playgroud)
这适用于第一个项目,但随后它崩溃了foreach循环.输出是:
item 1
致命错误:在第44行的example.php中调用未定义的方法DOMText :: getAttribute()
我没有得到的是调用getAttribute方法如何改变foreach循环的上下文.所以这里有两个问题:
$item->attributes with另一个foreach方法,然后比较属性名称data-text并在匹配的情况下读取值,但肯定有更好的方法来做到这一点?!问题是ul有文本节点作为子节点,而lis文本节点没有属性,因此您会收到错误.在尝试访问其属性之前,只测试子节点是否为元素节点
foreach ($items as $item) {
if ($item->nodeType == XML_ELEMENT_NODE)
echo $item->getAttribute('data-text');
}
Run Code Online (Sandbox Code Playgroud)
您也可以使用getElementsByTagName(),但如果您有嵌套列表,li也会选择其中的s.
$items = $list->getElementsByTagName('li');
foreach ($items as $item) {
echo $item->getAttribute('data-text');
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15411 次 |
| 最近记录: |