当我的 Ruby 代码中的 gsub 方法出现问题时,尝试将 HTML <a> 标签替换为从中剥离的 URL

Issue with gsub method in my Ruby code when trying to replace HTML <a> tags with the URL stripped from in it

提问人:s1rrv 提问时间:3/19/2021 更新时间:3/19/2021 访问量:108

问:

我试图实现基本的替代,但我发现很难确定这里的行为。

我想用其中包含的 URL 替换标签。

这是我的代码:

require 'nokogiri'

message = "Hi Testin wFAASF,
Thank you for booking with us.
Your work has been booked on Sep 16, 2020 1:00PM at 2026 South Clark Street / unit c / Chicago, Illinois 60616
Sincerely,
Varun Security
<a href=\"https://www.google.com\">Test This PR</a>"

puts message.gsub(Nokogiri::HTML.parse(message).at('a'), Nokogiri::HTML.parse(message).at('a')['href'])

我认为输出将是:

"Hi Testin wFAASF,
Thank you for booking with us.
Your work has been booked on Sep 16, 2020 1:00PM at 2026 South Clark Street / unit c / Chicago, Illinois 60616
Sincerely,
Varun Security
https://www.google.com

实际输出是多少:

"Hi Testin wFAASF,
Thank you for booking with us.
Your work has been booked on Sep 16, 2020 1:00PM at 2026 South Clark Street / unit c / Chicago, Illinois 60616
Sincerely,
Varun Security
<a href=\"https://www.google.com\">https://www.google.com</a>"

有人可以解释为什么会发生这种情况以及我如何做得更好吗?

html ruby html-parsing nokogiri gsub

评论

0赞 Lam Phan 3/19/2021
因为会隐式将第一个参数转换为正则表达式:==>(正则表达式会通过方法将参数对象隐式转换为 String,别名为 ,这意味着在您的情况下是“测试此 PR”)String#gsubRegexp.new(Nokogiri::HTML.parse(message).at('a'))/Test This PR/ #to_strNokogiri#Node#to_str:text attribute

答:

1赞 Amadan 3/19/2021 #1

因为既不是字符串也不是正则表达式。粘附作品:Nokogiri::XML::Element.to_s

puts message.gsub(
    Nokogiri::HTML.parse(message).at('a').to_s, 
    Nokogiri::HTML.parse(message).at('a')['href']
)

但是,您将不厌其烦地解析 HTML,只是为了再次搜索文档,就好像您对它一无所知一样。此外,如果你在一条消息中有多个链接,或者你的锚标记没有规范格式,它会给出一个错误的结果——例如,如果你有一个额外的空格,如下所示:<a href="https://www.google.com" >https://www.google.com</a>

为什么不让Nokogiri工作呢?

puts Nokogiri::HTML.fragment(message).tap { |doc|
  doc.css("a").each { |node|
    node.replace(node["href"])
  }
}.to_html

请注意,我更改了,因为这不是一个完整的 HTML 文档(包含 doctype 和所有文档),Nokogiri 觉得有义务添加。然后,对于每个定位点节点,将其替换为其属性的值。Nokogiri::HTML.fragmenthref

评论

0赞 s1rrv 3/19/2021
这就像一个魅力。我的下一次迭代将在电子邮件中做所有标签,并且正在查看 gsub,但这也有效。谢谢