【发布时间】:2014-11-17 21:06:50
【问题描述】:
我正在尝试使用 Nokogiri 将一些模板文件从一种格式转换为另一种格式。但它不断添加标签。我试图阻止它添加 Doctype 和元标记,但无法弄清楚。我试过了
@doc = Nokogiri::HTML.parse(r)
但这会添加标签。我也试过了
@doc = Nokogiri::HTML.fragment(r)
按照“How to prevent Nokogiri from adding <DOCTYPE> tags?”中的建议,但会删除文档中的任何 <html>、<head> 或 <body> 标记。
如果重要的话,我读取文件的代码是:
f = File.read(infile)
r = f.gsub(/<tmpl_var ([^>]*)>/, '{{{\1}}}')
@doc = Nokogiri::HTML.fragment(r)
我需要事先做一个gsub,因为我需要替换<tmpl_var>标签,这些标签不是正确的HTML,会导致更多问题。
使用HTML.fragment(r) 时,我确实收到htmlParseStartTag: misplaced <html> tag 错误(以及<body> 和<head> 的类似错误)。
有没有办法阻止它添加这些内容?
转换示例:
之前:
<html>
<head>
<script>
var x = "y";
</script>
</head>
<body>
<div>
Stuff
</div>
</body>
</html>
使用 Parse 后:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script>
var x = "y";
</script>
</head>
<body>
<div>
Stuff
</div>
</body>
</html>
使用HTML.fragment或HTML::DocumentFragment.parse后:
<script>
var x = "y";
</script>
<div>
Stuff
</div>
在这种情况下,我希望它只输出之前的部分。 (虽然在实际脚本中我做了很多更改)。
【问题讨论】:
-
在您的“之前”或“之后”部分中没有显示您要替换的标签。相反,您似乎在问两个不同的问题。
-
替换标签是另一个问题,我已经解决了。现在我只专注于阻止它添加 doctype 标签。 tmpl_var 的东西与这个问题无关,我只是把它作为我如何将文件读入 Nokogiri 的直接副本放在那里,以防使用字符串而不是文件直接重要。
-
如果 Temple_var 不相关,那么您甚至不应该记录或提及它,因为它是 red herring。
-
“我只是把它作为我如何将文件读入 Nokogiri 的直接副本保存在那里,以防使用字符串而不是文件直接很重要。”如果您在documentation for parsing 中四处寻找,您会看到诸如“string_or_io 可能是一个字符串,或者任何响应读取和关闭的对象,例如 IO 或 StringIO。”之类的语句。