You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DOMDocument中结合getElementsByTagName与getElementsByClassName报错求助

解决DOMDocument中链式调用getElementsByTagName和getElementsByClassName的错误

你遇到的问题很典型——getElementsByTagName('p')返回的是DOMNodeList类型的对象,而这个对象并没有getElementsByClassName()方法,只有DOMDocument或者单个DOMElement节点才有这个方法,所以直接链式调用就会触发"undefined method"的错误。

下面给你两种可行的解决方案:

方案一:使用DOMXPath(推荐,更灵活)

DOMXPath可以直接通过路径表达式精准定位到你需要的标签,不用先筛选所有p标签再二次过滤,效率和可读性都更好:

$information = html_entity_decode($value['information']);
$dom = new DOMDocument();
@$dom->loadHTML($information);

// 初始化XPath对象
$xpath = new DOMXPath($dom);
// 定位class为castplot的p标签
$targetElements = $xpath->query("//p[@class='castplot']");

// 检查是否找到目标元素
if ($targetElements->length > 0) {
    $castText = $targetElements->item(0)->textContent;
    // 这里就可以使用$castText了
}

如果你的目标p标签可能有多个class(比如<p class="castplot foo">),可以把XPath表达式改成更严谨的版本,避免匹配到类似castplot-other这样的class:

$targetElements = $xpath->query("//p[contains(concat(' ', normalize-space(@class), ' '), ' castplot ')]");

方案二:遍历DOMNodeList逐个检查

如果你不想用XPath,也可以先获取所有p标签,再循环遍历每个节点,检查它的class属性是否符合要求:

$information = html_entity_decode($value['information']);
$dom = new DOMDocument();
@$dom->loadHTML($information);

$pTags = $dom->getElementsByTagName('p');
$castText = '';

foreach ($pTags as $p) {
    $classAttr = $p->getAttribute('class');
    // 简单判断(适合单个class的情况)
    if ($classAttr === 'castplot') {
        $castText = $p->textContent;
        break; // 找到第一个匹配的就停止遍历
    }

    // 如果是多class场景,用下面的判断方式:
    // $classes = explode(' ', trim($classAttr));
    // if (in_array('castplot', $classes)) {
    //     $castText = $p->textContent;
    //     break;
    // }
}

// 处理获取到的$castText

内容的提问来源于stack exchange,提问作者jazuly aja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:46:11