Symfony Crawler中XPath无法读取含<符号的内容问题求助
问题根源
你遇到的问题是因为原始HTML里脂肪对应的<td>内容里的<没转成HTML实体<,HTML解析器会把这个<当成新标签的开头,直接破坏了< 0,1这部分内容的结构,导致Crawler解析后这个单元格里没有有效文本。
解决办法
优先修复原始HTML
如果能控制HTML的生成逻辑,把<替换成<,修正后的HTML如下:
<table> <tr> <td> Carbohydrate </td> <td> 10g </td> </tr> <tr> <td> Fat </td> <td> < 0,1 </td> </tr> </table>
修改后用你原来的XPath查询,$fatCell->nextAll()->text()就能正常获取到< 0,1。
无法修改HTML时的预处理方案
要是没法改动原始HTML,先对HTML字符串做预处理,把未转义的<替换成<再交给Crawler解析:
// 假设原始HTML存储在$html变量中 $fixedHtml = preg_replace('/<(?!\/?td|\/?tr|\/?table)/', '<', $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
相关产品推荐
相关产品推荐

