我有一个文档 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>
。是否有已知的真实的方法在文档构建阶段分配节点?这样我就不会用
text
方法跳舞了?即,我如何在构建阶段分配doc.h1
节点与a.at_css("#section#{n} h1")
节点的值?Nokogiri::Builder.with(...)
法的利润是多少?我想知道我是否可以使用它。
-
如何抓取
<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(...)
方法的利润是多少?这与你问题的其余部分无关。如文档所述:
使用现有的根对象创建构建器。当您有一个现有的文档,并且希望使用构建器方法进行扩展时,可以使用此方法。创建的构建器上下文将从给定的
root
节点开始。
一般来说,我发现在使用已知的层次结构从头编写大量自定义节点时,Builder非常方便。如果不这样做,您可能会发现创建一个新文档并使用DOM方法适当地添加节点会更简单。很难区分你的文档将有多少硬编码节点/层次结构,而不是程序创建的。
另一个可选的建议:也许您应该创建一个模板XML文档,然后使用来自另一个抓取的HTML的细节来扩展它?