1

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

2 回答 2

6

您可以使用简单的 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;
}
于 2013-04-18T21:51:42.570 回答
3

您的四部分问题分三个部分得到答案:

  1. getElementsByTagName 不接受 XPath 表达式,您需要给它一个标签名称;
  2. 没有任何输出,因为没有任何标签与您提供的标签名匹配(参见 #1);
  3. 看起来您想要的是 XPath,这意味着您需要创建一个 XPath 对象 - 请参阅PHP 文档了解更多信息;

此外,控制 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;
}
于 2013-04-18T21:45:33.883 回答