Nokogiri在读取html字符串时编码方括号

时间:2014-09-25 18:22:09

标签: ruby nokogiri

我正在使用nokogiri来读取文件的内容并执行一些替换操作。最后,我使用doc.to_s将内容作为字符串返回。

我已将代码简化为如下

html_string = '<a href="[foo]">foo</a>'
doc = Nokogiri::HTML(html_string)
doc.to_s 

我得到的输出是

<a href=\"%5Bfoo%5D\">foo</a> 

我想要的是保留方括号。请注意,当方括号不是HTML标记的属性时,它们不会被编码。

关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:2)

我认为没有办法阻止Nokogiri这样做,因为Nokogiri旨在产生正确的HTML输出。我能想到的最好的解决方案是对Nokogiri的输出进行后期处理:

doc_str = '<a href="%5Bfoo%5D">foo</a>'
doc_str.gsub!( /%5B(.+?)%5D/i, '[\1]' )
# => <a href="[foo]">foo</a>

我希望这会有所帮助。

答案 1 :(得分:0)

或者你可以做得更简单。

 CGI.unescape(doc.to_s)

答案 2 :(得分:0)

我一直在研究simliar问题,虽然方括号在hrefs中不是有效,但有些情况下会使用它们。在我的情况下,我需要保留它们以与客户的系统兼容。

2有用的事实:

1 - Nokogiri在将文档转换为文本时更正了HREF。如果你加载一个html片段并查看href,你会看到方括号在那里。

2 - 删除方括号仅发生在href属性中,它们在其他属性中被允许。例如data-raw-href

因此,如果您加载文档然后复制href属性,则可以保留原始文件。您仍需要在最终文本上进行后期处理,以将data-raw-href转换回href。

一个例子(你可以在irb中试试)

require 'nokogiri'
doctext = '<html><body><a href="[my dodgy href]">link text</a></body></html>'
doc = Nokogiri.HTML(doctext)
a_tag = doc.css('a')[0]
 a_tag['data-raw-href'] = a_tag['href']
doc.to_s

收率:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<a href="%5Bmy%20dodgy%20href%5D" data-raw-href="[my dodgy href]">link text</a>
</body></html>