如何使用DomDocument获取指定class的span标签内的文本内容
解决方法
你当前的代码已经通过DomXPath查询获取到了所有匹配的span节点集合(DOMNodeList对象),调整后即可拿到第一个节点的文本内容,具体有两种实现方式:
方式1:直接从查询结果中取第一个节点
DOMNodeList对象可以通过item(0)获取第一个匹配节点,访问其nodeValue属性即可得到节点内的纯文本:
$dom = new domDocument; // 屏蔽载入警告的同时加判断避免后续操作报错 if (@$dom->loadHTML($url)) { $classname = "test"; $finder = new DomXPath($dom); $spaner = $finder->query("//span[contains(@class, '$classname')]"); // 先判断是否存在匹配节点,避免调用item(0)时报错 if ($spaner->length > 0) { // 获取第一个节点的文本内容 $targetText = $spaner->item(0)->nodeValue; echo $targetText; // 输出结果就是hello world } }
方式2:在XPath语句中直接限定取第一个节点
XPath的下标从1开始计数,可以直接在查询路径末尾加[1]直接获取第一个匹配节点,减少后续判断逻辑:
$dom = new domDocument; if (@$dom->loadHTML($url)) { $classname = "test"; $finder = new DomXPath($dom); // 末尾加[1]直接取第一个匹配节点 $targetSpan = $finder->query("//span[contains(@class, '$classname')][1]"); if ($targetSpan->length > 0) { $targetText = $targetSpan->item(0)->nodeValue; } }
注意事项
你当前使用的contains(@class, '$classname')写法存在误匹配风险:如果存在<span class="test2">这类元素也会被匹配到。要精准匹配独立class,建议使用优化后的XPath语句:
//span[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]
该写法会先把class属性的前后空格去掉,再在前后拼接空格后判断是否包含独立的类名,避免误匹配。
内容的提问来源于stack exchange,提问作者shakky
相关产品推荐
相关产品推荐

