PHP DOMDocument如何获取此标记的内容?

时间:2013-04-18 21:27:59

标签: php html parsing domdocument

我正在使用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
  • 我没有在节点循环中输出任何内容
  • 如何了解这些复杂查询的语法?
  • 我做错了什么?

2 个答案:

答案 0 :(得分:5)

您可以使用简单的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;
}

答案 1 :(得分:3)

你的四部分问题分三部分给出答案:

  1. getElementsByTagName不接受XPath表达式,您需要为其指定标记名称;
  2. 没有输出,因为没有标签与您提供的标记名匹配(参见#1);
  3. 看起来你想要的是XPath,这意味着你需要创建一个XPath对象 - 更多信息请参见the PHP docs;
  4. 另外,控制libxml错误的更好方法是使用libxml_use_internal_errors(true)(而不是'@'运算符,它还会隐藏其他更合法的错误)。那会让你看起来像这样的代码:

    <?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;
    }