【问题标题】:Nokogiri encoding square brackets when reading html string读取 html 字符串时的 Nokogiri 编码方括号
【发布时间】:2015-03-31 17:27:59
【问题描述】:

我正在使用 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 标记的属性时,它们不会被编码。

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

【问题讨论】:

  • 从技术上讲,方括号不应该出现在这样的 URL 中,因此 Nokogiri 只是遵守标准。允许的字符集实际上很小。

标签: ruby nokogiri


【解决方案1】:

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

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

我希望这会有所帮助。

【讨论】:

  • 一不小心可能会导致各种问题,所以不要申请太宽松。
  • 确实可以。当心。 (这就是大多数模板引擎使用诸如{{this}} 之类的占位符的原因,因为与单个方括号相比,它在野外出现的可能性要小得多。)
【解决方案2】:

或者你可以做得更简单。

 CGI.unescape(doc.to_s)

【讨论】:

  • 当然,如果您不希望任何 URL 转义字符出现在文档中的任何位置。当我们只关心两个总是成对出现的角色时,这似乎有点过头了。
  • 如果您仅将其应用于hrefs,这可能是一个很好的答案
【解决方案3】:

我一直在研究一个类似的问题,虽然方括号在 href 中不是有效,但在某些情况下会用到它们。就我而言,我需要保留它们以与客户的系统兼容。

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多