【问题标题】:Nokogiri replace strips content of HTMLNokogiri 替换 HTML 的条带内容
【发布时间】:2011-07-15 12:34:40
【问题描述】:

我想从一些 HTML 中删除一个标签,而不剥离任何标记的剩余内容。比如我有一个文件,test.html:

<p class="P1"><span class="T2">Some text, goes to uppercase</span>
<p class="P4"><span class="T4"> </span><span class="T3">other text</span>
<span class="T5">italics</span><span class="T3">‘more text with UTF-8 ’</span>
</p></p>

我想得到以下输出:

SOME TEXT, GOES TO UPPERCASE
other text
<em>italics<em> ‘more text with UTF-8 ’

我的代码是:

f = File.open('raw/test.html',"r")
doc = Nokogiri::XML::DocumentFragment.parse(f.read.encode('UTF-8'))
f.close

doc.css("span.T2").each do |span|
  span.replace span.content.upcase
end
doc.css("span.T5").each do |span|
  span.replace "<em>"+span.content+"</em>"
end
doc.css("span").each do |span|
  span.replace span.content
end
doc.css("p").each do |p|
  p.replace Nokogiri::XML::Text.new(p.inner_html, p.document)
end

f = File.open('processed/test.html',"w")
f.write(doc)
f.close

我得到的输出是:

SOME TEXT, GOES TO UPPERCASE
&lt;p class="P4"&gt;
 other text
&lt;em&gt;italics &lt;/em&gt;&amp;#x2018;more text with UTF-8 &amp;#x2019;
&amp;#x2018;our common mother&amp;#x2019;
&lt;/p&gt;

非常感谢。

更新

解决方法如下:

coder = HTMLEntities.new 
f = File.open('raw/test.html',"r") 
doc = Nokogiri::XML::DocumentFragment.parse(f.read.encode('UTF-8')) 
f.close 
doc.css("p").each do |p| 
  p.replace p.inner_html 
end 

doc.css("span.T2").each do |span| 
  span.replace span.content.upcase 
end 

doc.css("span.T5").each do |span| 
  span.replace "<em>"+span.content+"</em>" 
end 

doc.css("span").each do |span| 
  span.replace span.inner_html 
end 

f = File.open('processed/test.html',"w") 
f.write(coder.decode(doc)) 
f.close

【问题讨论】:

  • 在第一个文件访问中使用File.read 而不是File.open。编写时使用File.open的块形式。它更安全,更符合 Ruby 语言习惯。

标签: ruby encoding utf-8 html-parsing nokogiri


【解决方案1】:

使用span.replace "&lt;em&gt;"+span.content+"&lt;/em&gt;" 是不正确的。您需要告诉 Nokogiri 替换为 HTML,而不是文本。例如:

span.inner_html = "<em>"+span.content+"</em>"

结果:

<span class="T5"><em>italics</em></span>

【讨论】:

  • 谢谢@the-Tin-Man。但是,如果我将 codespan.replace = "+span.content+"/em"code 更改为 codespan.inner_html = "+span.content+"/em"code ,它会导致以下错误(我在 Win7 上运行 Cygwin)code C:/Ruby192/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4.1-x86-mingw32/lib/nokogiri/xm l/node.rb:743:in []': can't convert Symbol into Integer (TypeError) code` 除此之外,期望的结果是code斜体code不是code斜体code
  • 我最终解决了如下问题(安装 htmlentities gem):code coder = HTMLEntities.new f = File.open('raw/test.html',"r") doc = Nokogiri ::XML::DocumentFragment.parse(f.read.encode('UTF-8')) f.close doc.css("p").each do |p| p.replace p.inner_html end doc.css("span.T2").each do |span| span.replace span.content.upcase end doc.css("span.T5").each do |span| span.replace ""+span.content+"" end doc.css("span").each do |span| span.replace span.inner_html end f = File.open('processed/test.html',"w") f.write(coder.decode(doc)) f.close code
  • 以上如果有点不清楚,我也发到Google Groups
  • 为什么不重新编辑你原来的问题,然后把更改放在那里?这样你就可以正确地格式化它,并且每个人都可以看到它,而不必去另一个站点。您正在加载 htmlentities 并对代码进行后处理这一事实看起来您仍然没有正确替换您的 HTML。我会尽量抽出时间来看看更完整的解决方案,因为你在不必要地跳过篮球。
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2016-06-09
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多