我有一个 A 的文档,想要使用 A 的节点值构建一个新的 B 。
鉴于 A 看起来像这样......
<html>
<head></head>
<body>
<div id="section0">
<h1>Section 0</h1>
<div>
<p>Some <b>important</b> info here</p>
<div>Some unimportant info here</p>
</div>
<div>
<div id="section1">
<h1>Section 1</h1>
<div>
<p>Some <i>important</i> info here</p>
<div>Some unimportant info here</div>
</div>
<div>
</body>
</html>
在构建 B 文档时,我正在使用方法a.at_css("#section#{n} h1").text
从 A 的h1
标记中获取数据,如下所示:
require 'nokogiri'
a = Nokogiri::HTML(html)
Nokogiri::HTML::Builder.new do |doc|
...
doc.h1 a.at_css("#section#{n} h1").text
...
end
所以有三个问题:
如何获取保留内部标签的<p>
标签内容
<p>
?
目前,我点击a.at_css("#section#{n} p").text
后
返回一个纯文本,这不是我们需要的。
如果我点击.text
或.to_html
而不是.inner_html
,则html会显示为已转义。例如,我得到<p>
而不是<p>
。
在文档构建阶段是否有任何已知的 true 分配节点的方法?所以我根本不会用text
方法跳舞?即如何在构建阶段为doc.h1
节点分配a.at_css("#section#{n} h1")
节点的值?
Nokogiri::Builder.with(...)
方法的利润是多少?我想知道我是否可以使用它......
答案 0 :(得分:1)
如何获取保留<p>
内标记的<p>
代码的内容?
使用.inner_html
。访问实体时不会对其进行转义。如果您执行builder.node_name raw_html
之类的操作, 将被转义。代替:
require 'nokogiri'
para = Nokogiri.HTML( '<p id="foo">Hello <b>World</b>!</p>' ).at('#foo')
doc = Nokogiri::HTML::Builder.new do |d|
d.body do
d.div(id:'content') do
d.parent << para.inner_html
end
end
end
puts doc.to_html
#=> <body><div id="content">Hello <b>World</b>!</div></body>
在文档构建阶段是否有任何已知的分配节点的真实方法?
与上述类似,一种方法是:
puts Nokogiri::HTML::Builder.new{ |d| d.body{ d.parent << para } }.to_html
#=> <body><p id="foo">Hello <b>World</b>!</p></body>
瞧!节点已从一个文档移动到另一个文档。
Nokogiri::Builder.with(...)
方法的利润是多少?
这与你提出的其他问题无关。正如the documentation所说:
使用现有根对象创建构建器。当您拥有要使用构建器方法扩充的现有文档时,可以使用此选项。创建的构建器上下文将从给定的
root
节点开始。
我不认为这对你有用。
通常,我发现使用已知层次结构从头开始编写大量自定义节点时,Builder很方便。如果不这样做,您可能会发现创建新文档并使用DOM方法根据需要添加节点更简单。很难说出你的文档与程序创建的硬编码节点/层次结构有多少。
另一个替代建议:也许您应该创建一个模板XML文档,然后使用其他HTML格式的详细信息来扩充它?