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

Symfony Crawler中XPath无法读取含<符号的内容问题求助

问题根源

你遇到的问题是因为原始HTML里脂肪对应的<td>内容里的<没转成HTML实体&lt;,HTML解析器会把这个<当成新标签的开头,直接破坏了< 0,1这部分内容的结构,导致Crawler解析后这个单元格里没有有效文本。

解决办法

优先修复原始HTML

如果能控制HTML的生成逻辑,把<替换成&lt;,修正后的HTML如下:

<table>
<tr>
    <td> Carbohydrate </td>
    <td> 10g </td>
</tr>
<tr>
    <td> Fat </td>
    <td> &lt; 0,1 </td>
</tr>
</table>

修改后用你原来的XPath查询,$fatCell->nextAll()->text()就能正常获取到< 0,1。

无法修改HTML时的预处理方案

要是没法改动原始HTML,先对HTML字符串做预处理,把未转义的<替换成&lt;再交给Crawler解析:

// 假设原始HTML存储在$html变量中
$fixedHtml = preg_replace('/<(?!\/?td|\/?tr|\/?table)/', '&lt;', $html);

$crawler = new Crawler($fixedHtml);
$fatCell = $crawler->filterXPath('//td[contains(text(), "Fat")]');
$fatValue = trim($fatCell->nextAll()->text()); // 最终得到 "< 0,1"

这个正则只会替换非表格标签(td/tr/table)开头的<,不会破坏原有表格结构。

额外优化技巧

可以直接定位到包含"Fat"的整行<tr>,再提取第二个<td>,写法更简洁:

$fatValue = $crawler->filterXPath('//tr[td[contains(text(), "Fat")]]/td[2]')->text();

记得用trim()处理结果,能去掉多余的换行和空格,得到更干净的内容。

内容的提问来源于stack exchange,提问作者D. Schreier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:55:18