使用 Nokogiri(而不是 Tidy)清理 HTML

2023-12-28

The tidygem 不再维护,并且存在多个内存泄漏问题。

有些人建议使用Nokogiri。

我目前正在使用以下方法清理 HTML:

Nokogiri::HTML::DocumentFragment.parse(html).to_html

不过我有两个问题:

  • Nokogiri 删除了DOCTYPE

  • 有没有一种简单的方法可以强制清理后的 HTML 具有html and body tag?


如果您正在处理完整的文档,您需要:

Nokogiri::HTML(html).to_html

这将迫使html and body标签,并引入或保留DOCTYPE:

puts Nokogiri::HTML('<p>Hi!</p>').to_html
#=> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
#=>  "http://www.w3.org/TR/REC-html40/loose.dtd">
#=> <html><body><p>Hi!</p></body></html>

puts Nokogiri::HTML('<!DOCTYPE html><p>Hi!</p>').to_html
#=> <!DOCTYPE html>
#=> <html><body><p>Hi!</p></body></html>

请注意,不保证输出在语法上有效。例如,如果我提供了一个损坏的文档,该文档撒谎并声称它是 HTML4.01 严格的,Nokogiri 将输出具有该 DOCTYPE 但没有所需的文档<head><title>...</title></head>部分:

dtd = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">'
puts Nokogiri::HTML("#{dtd}<p>Hi!</p>").to_html
#=> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
#=>  "http://www.w3.org/TR/html4/strict.dtd">
#=> <html><body><p>Hi!</p></body></html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Nokogiri(而不是 Tidy)清理 HTML 的相关文章

随机推荐

  • 在扭曲协议中定期运行函数

    我正在寻找一种方法来定期通过连接到 TCP 端口的所有客户端发送一些数据 我正在看扭曲的Python 我知道reactor callLater 但是我如何使用它定期向所有连接的客户端发送一些数据 数据发送逻辑位于Protocol类中 由反应
  • AbstractDataTable fireTableDataChanged() 不刷新jtable

    我在向 jtable 添加数据时遇到困难 它首先从集合中加载数据 使用 jtextfield 添加新数据 当然数据已添加到调试过的集合中 但我无法在 jtable 中显示新添加的日期 我已经尝试了所有可能的方法但无法成功 下面的代码是我工作
  • 为样式表创建有效的条件注释,不会出现“虚假注释”验证器错误

    我的 head 标签中有以下内容
  • 启动画面不会将焦点返回到主窗体

    我大家 目前 我在使用启动画面时注意力不集中 我使用的是 VS2008 带有 NET Framework 2 0 另外 我已将我的项目与 VisualBasic dll 链接起来 因为我使用 ApplicationServices 来管理我
  • 该页面的状态信息无效并且可能已损坏

    在 Internet Explorer 中浏览我的 asp net 页面时 我收到以下错误 在 Firefox 或 Mozilla 中 一切正常 我尝试了不同的方法 因为我认为 VIEWSTATE 存在以下问题
  • 哪些 C++0x 标头应该定义 nullptr?

    现在 C 0x 即将到来 我一直在尝试它 特别是使用 nullptr 我无法弄清楚如果需要使用它 应该包含哪些标准头文件 任何帮助表示赞赏 不需要标头 它是一个内置关键字 lex nullptr 2 14 7 指针文字 lex nullpt
  • 可以索引子查询吗?

    我有一个表和一个查询 如下所示 有关工作示例 请参阅此SQL小提琴 http sqlfiddle com 2 762a82 13 SELECT o property B SUM o score1 w score FROM o INNER J
  • 最长匹配子串

    如何在 varchar 变量中搜索最长的匹配项 例如 表 GOB 的条目如下 magic word prize sh 0 20 sha 0 40 shaz 0 60 shaza 1 50 我想编写一个 plpgsql 函数 它在其他参数中接
  • 在Github上,将PR合并到不同的分支

    假设有人在 Github 上向 public master 提交了一个 PR 有没有办法将该 PR 合并到不同的分支中 否则 看起来我必须合并到 public master 中 然后将其向后合并到开发 登台分支中 这就像让人们做一个修补程序
  • 线程并获取连接电话的 COM 端口

    我有以下代码 using System using System Collections Generic using System ComponentModel using System Data using System Drawing
  • 如何使用python绘制彩色扇形?

    我需要可视化传感器的视场 因此 我需要使用 python matplotlib 绘制一个扇区 并用颜色 alpha Use a 楔形艺术家 http matplotlib org api artist api html matplotlib
  • 将大型 CSV 从 Cloud Storage 导入 App Engine 数据存储区

    我有一个大的 CSV 文件 大约 1 GB 大 并且想要在数据存储中创建实体 每行一个实体 该 CSV 文件当前驻留在 Google Cloud Storage 中 有没有一种干净的方法来做到这一点 我可以在网上找到的所有示例似乎都依赖于本
  • DataTriggerBehavior 不适用于 Enum?

    我正在尝试使用DataTriggerBehavior来自行为 SDK 但它似乎不适用于枚举 否则我做错了什么 您可以假设DataContext对于这些例子来说是这样的 INotifyPropertyChanged已实现 但我不打算在这里展示
  • 即使服务帐户具有“所有者”权限,也会引发权限不足的错误

    In 谷歌云平台我创建了一个服务账户并分配了OWNER and 服务帐户参与者 role 当我运行下面的命令时 gcloud container clusters get credentials travis test zone us ce
  • 我有一些关于 WebView 的问题

    我无法正确使用WebView 当我运行我的应用程序时 出现 使用什么 窗口和按钮 浏览器 Chrome 排序 单击 取消 时没有任何反应 我的代码没有错误 我真的不知道如何正确使用WebView 请帮我 使用什么 窗口 https i st
  • Redis 流水线执行顺序

    我正在使用 rub redis gem 想知道我是否这样做 例如 redis pipelined do REDIS del users current user id i unread REDIS lpush users current u
  • 如何附加到切片指针接收器

    我有一个切片的类型别名 当切片是指针接收器时 我希望能够附加到切片 或切片中的过滤器 package main import fmt type itself string func h itself appendToItself test
  • 需要同意才能将文件的所有权转让给其他用户 [Google Drive API]

    我有一个与 1 个用户 所有者 Gmail 帐户 和第二个用户 作者 Google 服务帐户 如 iam gserviceaccount com 共享的 Google 表格文件 我使用此函数由用户 2 从用户 1 复制表 并再次使复制文件的
  • 管理 JavaScript 应用程序的时区和 DST 问题

    我正在尝试创建一个调度应用程序 前端 UI是使用JavaScript开发的 后端是一个 ASP NET Web Api 应用程序 使用 MSSQL 服务器作为数据库 从 UI 中 用户将安排一个可以每天 每周 每月运行的作业 每个作业最多可
  • 使用 Nokogiri(而不是 Tidy)清理 HTML

    The tidygem 不再维护 并且存在多个内存泄漏问题 有些人建议使用Nokogiri 我目前正在使用以下方法清理 HTML Nokogiri HTML DocumentFragment parse html to html 不过我有两