Nokogiri解析含<或>的HTML文本丢失内容的解决方法
解决Nokogiri解析含<或>文本时丢失符号的问题
问题原因
XML解析器对语法要求严格,当文本中出现未转义的<或>时,会被误判为标签的起始/结束标记。比如<td>< 109</td>里的<会被当成无效标签的开头,解析器自动修正时会丢弃这个符号,导致最终文本丢失<。
解决方案
1. 改用HTML模式解析(最简便)
HTML解析器容错性更强,能正确识别文本中的未转义<和>:
str = '<td>< 109</td>' doc = Nokogiri::HTML(str) puts doc.at('td').text # 输出 "< 109"
2. 预处理字符串转义特殊字符
如果必须使用XML解析,先将文本中的<和>转成XML实体(注意不要转义标签本身的符号):
str = '<td>< 109</td>' # 仅转义标签外的<和> escaped_str = str.gsub(/(?<!<)<(?!>)/, '<').gsub(/(?<!<)>(?!>)/, '>') doc = Nokogiri::XML(escaped_str) puts doc.at('td').text # 输出 "< 109"
3. 开启XML解析的恢复模式
让Nokogiri在解析XML时尽可能保留原始内容,忽略语法错误:
str = '<td>< 109</td>' doc = Nokogiri::XML(str) { |cfg| cfg.recover } puts doc.at('td').content # 输出 "< 109"
内容的提问来源于stack exchange,提问作者Ali Raza
相关产品推荐
相关产品推荐

