我使用的DOMDocument希望来解析这个小的HTML代码。 我在寻找一个特定的span
与特定标签id
。
<span id="CPHCenter_lblOperandName">Hello world</span>
我的代码:
$dom = new domDocument;
@$dom->loadHTML($html); // the @ is to silence errors and misconfigures of HTML
$dom->preserveWhiteSpace = false;
$nodes = $dom->getElementsByTagName('//span[@id="CPHCenter_lblOperandName"');
foreach($nodes as $node){
echo $node->nodeValue;
}
但出于某种原因,我觉得有什么不妥无论是代码或HTML(我怎么知道?):
- 当我数与节点
echo count($nodes);
结果总是1 - 我得到的节点环路输出什么
- 如何了解这些复杂的查询语法?
- 我做错了什么?
您可以使用简单的getElementById:
$dom->getElementById('CPHCenter_lblOperandName')->nodeValue
或者选择方式:
$selector = new DOMXPath($dom);
$list = $selector->query('/html/body//span[@id="CPHCenter_lblOperandName"]');
echo($list->item(0)->nodeValue);
//or
foreach($list as $span) {
$text = $span->nodeValue;
}
你的四层部分的问题得到三个部分答案:
- 的getElementsByTagName不采取XPath表达式,你需要给它一个标签名称;
- 没有什么是输出,因为没有标签将永远与您提供的标记名(参见#1);
- 它看起来像你想要的是XPath的,这意味着你需要创建一个XPath对象-看到了PHP文档更多;
另外,控制的libxml错误的更好的方法是使用libxml_use_internal_errors(真)(而不是“@”操作,这也将隐藏其他更合理的错误)。 这将使你的代码看起来是这样的:
<?php
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
foreach($xpath->query("//span[@id='CPHCenter_lblOperandName']") as $node) {
echo $node->textContent;
}