html - 如何使用 Nokogiri 替换文本字符串的“inner_html”
问题描述
我想获取一个 HTML 字符串并返回一个保留 HTML 结构但带有混淆文本/内部 HTML 的变异版本。
例如:
string = "<div><p><h1>this is some sensitive text</h1><br></p><p>more text</p></div>"
obfuscate_html_string(string)
=> "<div><p><h1>**** **** **** **** ****</h1><br></p><p>**** ****</p></div>"
我进行了实验,虽然该inner_html=
方法似乎很有用,但它引发了一个参数错误:
Nokogiri::HTML.fragment(value).traverse { |node| node.content = '***' if node.inner_html }.to_s
=> "***"
Nokogiri::HTML.fragment(value).traverse { |node| node.content ? node.content = '***' : node.to_html }.to_s
=> "***"
Nokogiri::HTML.fragment(value).traverse { |node| node.inner_html = '***' if node.inner_html }.to_s
=> ArgumentError: cannot reparent Nokogiri::XML::Text there
解决方案
这应该会有所帮助,但文档对此进行了更详细的介绍。
您的 HTML 有问题,因为它是无效的,这迫使 Nokogiri 进行修复,此时将更改 HTML:
require 'nokogiri'
doc = Nokogiri::HTML("<div><p><h1>this is some sensitive text</h1><br></p><p>more text</p></div>")
doc.errors # => [#<Nokogiri::XML::SyntaxError: 1:53: ERROR: Unexpected end tag : p>]
doc.to_html
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n" +
# "<html><body><div>\n" +
# "<p></p>\n" +
# "<h1>this is some sensitive text</h1>\n" +
# "<br><p>more text</p>\n" +
# "</div></body></html>\n"
Nokogiri 报告 HTML 中存在错误,因为您不能h1
在 a 中嵌套标签p
:
ERROR: Unexpected end tag : p>
这意味着它无法理解 HTML,并尽最大努力通过提供/更改结束标签来恢复,直到它对它有意义为止。这并不意味着 HTML 实际上就是您或作者想要的样子。
从那时起,您查找节点的尝试可能会失败,因为 DOM 已更改。
总是检查errors
,如果它不是空的,要非常小心。最好的解决方案是通过 Tidy 或类似的东西运行该 HTML,然后处理其输出。
不过,从那时起,这应该可行:
node = doc.at('div h1')
node.inner_html = node.inner_html.tr('a-z', '*')
node = doc.search('div p')[1]
node.inner_html = node.inner_html.tr('a-z', '*')
puts doc.to_html
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html><body><div>
# >> <p></p>
# >> <h1>**** ** **** ********* ****</h1>
# >> <br><p>**** ****</p>
# >> </div></body></html>
推荐阅读
- azure-functions - 登录 Azure Functions
- pygame - 重绘 Pygame 窗口的最佳方法是什么?
- swift - 了解比较可选字符串
- android - 无法解析 com.android.billingclient:billing:1.1
- mongodb - 尝试使用 mongdb 在 discord.js 中查找用户被静音的次数
- emacs - 有没有办法找到键绑定的文件行
- lucene - 使用 Lucene 7 OpenNLP 查询词性标签
- java - 为什么我的哈希表不能在更大的范围内工作?
- node.js - Node.js 请求 - 获取响应值不起作用
- c# - 如何将类属性分配给 Windows 表单变量上的点