我目前正在执行一项任务,在所有.asp文件的元描述末尾添加公司名称。有了Nokogiri
和Ruby
的一些知识,我认为我应该能够自动化这个"人力密集型"任务。我可以很容易地浏览应用程序,并得到一个描述列表要更改。但是,如何更改值并将其写回文件呢?
我正试图用Nokogiri做这件事,但似乎Nokogiri被设计成废弃数据和编写xml,但不完全html。(应用程序相当简单,只是包括一些重复的代码,根本没有逻辑……所以可以视为html/文本)。Nokogiri提供这个功能吗?如果不行,我还能做什么?谢谢!
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输出样式,因为网站的内容人员使用不同的工具,以及一些自动化。解析器可以很好地处理它。
打开文件,使用regex
或String
来识别替换和gsub
,然后写回文件。
有很多关于SO的解决方案,这里只是一个简单的例子
File.write("hello.txt",File.open("hello.txt",&:read).gsub("install","upgrade"))
这将把"hello.txt"中的"install"替换为"upgrade"