使用XPath求和遇空单元格返回NAN,需将空单元格视为0处理
解决XPath sum遇到空单元格返回NaN的问题
嘿,这个问题我之前也碰到过!你遇到的情况是因为当<td></td>这种空单元格存在时,XPath的number()函数对空节点会返回NaN,而sum()函数只要计算的集合里有一个NaN,最终结果就会变成NaN。要解决这个问题,我们只需要在求和前把空单元格(包括只有空白字符的单元格)转换成0就行。
解决方案:修改XPath表达式
我们可以在XPath里对每个目标单元格做预处理:先标准化内容(去掉前后空白),转换成数字,如果转换结果是NaN(空或非数字内容),就用0代替,再进行求和。
修改后的完整代码示例:
$file = $DOCUMENT_ROOT . 'URL'; $doc = new DOMDocument; // 加载HTML时忽略一些常见的HTML格式错误,避免报错 $doc->loadHTMLFile($file, LIBXML_NOERROR | LIBXML_NOWARNING); $xpath = new DOMXpath($doc); // 关键是这个XPath表达式:处理空单元格为0 $total = $xpath->evaluate('sum(//table//tr/td[4]/(number(normalize-space(.)) or 0))'); print $total;
表达式解释
normalize-space(.):去掉单元格内容的前后空白,把<td> </td>这种仅含空格的单元格也识别为空;number(...):把处理后的内容转换成数字,空内容会变成NaN;(number(...) or 0):在XPath中,NaN会被视为布尔值false,所以当转换结果是NaN时,会返回0,否则返回转换后的数字;sum(...):对所有处理后的数值求和,这样就不会出现NaN了。
如果你的表格里还有非数字的内容(比如文本),这个表达式也会把它们当成0处理。如果需要只计算纯数字的单元格,可以再调整XPath的过滤条件,但根据你的需求,这个方案刚好能解决空单元格导致的NaN问题。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

