如何使用Nokogiri更改HTML元数据?

时间:2014-08-01 18:29:06

标签: ruby nokogiri

我目前的任务是在所有.asp文件的元描述末尾添加公司名称。通过对NokogiriRuby的一些了解,我认为我应该能够自动完成这项“人力密集型”任务。我可以轻松地搜索asps,并获得一个要更改的描述列表。但是,如何更改值并将其写回文件?

我试图用Nokogiri这样做,但似乎Nokogiri被设计为废弃数据并编写xml但不是很好的htmls。 (asps非常简单,只包含一些重复的代码,根本没有逻辑......因此可以视为html / text)。 Nokogiri是否提供此功能?如果没有,我还能做什么?谢谢!

2 个答案:

答案 0 :(得分:2)

Nokogiri非常出色:

require 'nokogiri'

doc = Nokogiri::HTML.parse(<<EOT)
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
    <meta name="description" content="Free Web tutorials">
  </head>
  <body></body>
</html>
EOT

meta = doc.at('meta[@name]')
meta['content'] = 'foo'

puts doc.to_html
# >> <!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=US-ASCII">
# >>     <meta name="description" content="foo">
# >>   </head>
# >>   <body></body>
# >> </html>

如果您想在说明的content附加内容:

meta['content'] = meta['content'] + ' by foobar'

结果是:

# >> <!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=US-ASCII">
# >>     <meta name="description" content="Free Web tutorials by foobar">
# >>   </head>
# >>   <body></body>
# >> </html>

如果创作者更改为不同的HTML生成器,那么您无法控制的HTML可能会以疯狂和奇妙的方式进行更改。这可能会破坏您的应用程序,除非您使用强大的东西,并且HTML的正则表达式不够健壮。

编写匹配的模式很容易

<meta name="description" content="Free Web tutorials">

写一个匹配那天的那个并不容易,然后

<meta 
name="description"

content="Free Web tutorials"
>

下一个。

很容易想象看到各种HTML输出样式,因为网站的内容人们使用了不同的工具,以及一些自动化。解析器可以很好地处理它。

答案 1 :(得分:0)

使用regexString打开文件以确定替换文件,并gsub将其正确识别,然后写回文件。

这个Heres just one的SO有很多解决方案和一个简短的例子

File.write("hello.txt",File.open("hello.txt",&:read).gsub("install","upgrade"))

这将用“upgrade”替换“hello.txt”中“install”一词的每个实例