ruby-on-rails 如果包含“〈”,Nokogiri将丢失html内部文本

ndasle7k  于 2022-12-24  发布在  Ruby
关注(0)|答案(2)|浏览(99)

我正在编写一个rake任务,将HTML字符串更改为JSON,为此我使用Nokogiri来解析HTML字符串并构建JSON,一切都很顺利,直到我注意到如果我有一个像这样的内部文本

< 109

> 109

则nokogiri返回**“109”,而不是"〉109””〈109”**
如果我有一个字符串

str = <td>< 109</td>

那么

result = Nokogiri::XML(str)

会回来

#(Document:0x115f8 {
  name = "document",
  children = [ #(Element:0x1160c { name = "td", children = [ #(Text " 109")] })]
  })

以及

result.children.children.to_s

将返回**”109”,但我需要"〈109”**
我怎样才能得到理想的结果?
我希望得到**"〈109”而不是仅”109”**

k4emjkb1

k4emjkb11#

您可以将Nokogiri::XML替换为Nokogiri::HTML,这是一个更宽松的语法错误:

Nokogiri::XML('<td>< 109</td>').children.last.text  # => " 109"
Nokogiri::HTML('<td>< 109</td>').children.last.text # => "< 109"
uqjltbpv

uqjltbpv2#

这是一个损坏的HTML,如果这是你唯一想解决的问题,那么你可以在解析它之前修复它。你可以用&lt替换所有的<

str = '<td>< 109</td>'

fixed_str = str.gsub(/>< ([0-9]+)</, '>&lt; \1<')
=> "<td>&lt; 109</td>"

result = Nokogiri::XML(str)
=> #(Document:0x2ac1be2860cc { name = "document", children = [ #(Element:0x2ac1be282940 { name = "td", children = [ #(Text "< 109")] })] })

如果还有>字符

fixed_str = str.gsub(/>< ([0-9]+)</, '>&lt; \1<').gsub(/>> ([0-9]+)</, '>&gt; \1<')

相关问题