DOMXPath查询问题:如何判断页面是否含指定内容的<h2>标签
解决DOMXPath判断“History”
存在性并获取后续段落的问题
我来帮你搞定这个DOMXPath的问题!核心问题是你之前的写法没先判断目标
是否存在,直接去取后续段落导致逻辑走不到else分支。我们可以分两步处理:先确认目标
存在,再处理后续内容;不存在则输出静态内容。
假设你的主内容在class为main-content的div里(你可以根据实际的ID/class调整选择器),下面是完整的PHP代码示例:
// 先加载DOM文档(示例代码,根据你的实际场景调整) $dom = new DOMDocument(); @$dom->loadHTML($htmlContent); // @符号用于忽略解析时的非致命警告,按需取舍 $xpath = new DOMXPath($dom); // 1. 定位主内容区域,再精准查询包含“History”文本的<h2> $historyH2 = $xpath->query("//div[@class='main-content']/h2[contains(normalize-space(text()), 'History')]"); // 2. 判断是否找到目标<h2>节点 if ($historyH2->length > 0) { // 获取该<h2>后面的第一个同级<p>标签 $firstParagraph = $xpath->query("following-sibling::p[1]", $historyH2->item(0)); if ($firstParagraph->length > 0) { echo $dom->saveHTML($firstParagraph->item(0)); } else { // 可选:如果<h2>存在但后面没有段落的处理逻辑 echo "History section has no following paragraph"; } } else { // 目标<h2>不存在时,输出你的静态内容 echo "This page doesn't have a History section. Here's your static content..."; }
关键细节说明:
normalize-space(text()):用来去除文本前后的空格、换行符,避免因为文本里的空白导致匹配失败(比如
<h2> History </h2>也能被正确匹配)。following-sibling::p[1]:这个轴选择器专门取当前节点(找到的)之后的第一个同级
元素,确保只获取紧跟的第一个段落。
- 检查
length属性:DOMXPath查询返回的DOMNodeList对象,通过length > 0判断是否找到节点,这是触发else分支的核心前提,之前的写法大概率漏掉了这个检查。
如果你的主内容div用的是ID而非class,把查询语句改成//div[@id='main-content']即可,完全适配你的页面结构。
内容的提问来源于stack exchange,提问作者Gislef
相关产品推荐
相关产品推荐

