在没有正则表达式的情况下解析Bash脚本中的HTML文档

时间:2012-02-23 00:21:13

标签: bash html-parsing

我的任务是以编程方式将HTML主模板拆分为子模板,对每个模板执行一些小修改,并保存生成的文件。

为什么我使用Bash (你可以跳过这个来解决问题)

(已编辑)使用Bash的选择相当随意。我知道它运行Red Hat 5.5,所以我写了一个Bash脚本。它确实有一个PHP解释器,但我决定不使用PHP,因为同一台服务器将托管使用PHP的网站,可能会看到很多流量,所以我害怕绑定一个FastCGI每小时执行此操作的套接字(我不控制脚本执行的频率,只是执行的内容)。我也可以安装我想要的任何解释器(我实际上已经知道的脚本语言:Perl,Python,PHP,也许是Lua)。然而,这是一个不同的问题。这个问题假设我想使用Bash脚本。

问题

我有一个主模板文件,类似于:

<!DOCTYPE html PUBLIC .... >
<html lang="en" ...>
<head> ... </head>
<body>
    <div id=...></div>
    <div id=...></div>
</body>
</html>

由此,我需要从文档顶部解析到</head>,从该部分中删除几行并添加一行,将<title>占位符替换为实际标题,并且将其保存到文件中。然后我需要将<body>和第一个<div>解析为单独的文件,然后最后解析第二个<div>(我还需要在页脚中对其进行一些更改)。我将丢弃</body></html>,因为此模板实际上是两层模板的一部分(替换的页面标题将使用Smarty变量来获取其文本)。

难题

问题是,有没有比正则表达更容易/更好的方法呢?我知道Bash提供了复合命令[[ htmlstring =~ "/regex/" ]]${BASH_REMATCH}来匹配或替换,但我也知道用正则表达式解析HTML通常是a bad idea

3 个答案:

答案 0 :(得分:2)

如果要解析的HTML文件具有已知的固定结构,则可以使用awk。编写一个将状态保存在变量中的程序(例如,等待标题,解析标题,等待正文)并在读取文件时执行不同的操作并不是很困难。它还支持正则表达式,您可以将所有内容放入结构良好的文件中。

答案 1 :(得分:1)

您可以使用命令-H提供的xmlstarlet(HTML)选项来操作HTML文件。

例如:

# content of template file
$ cat template.html
<!DOCTYPE html >
<html lang="en">
    <head> ... </head>
    <body>
        <div id="div1"></div>
        <div id="div2"></div>
    </body>
</html>

# update the head tag
$ xmlstarlet ed -H -u '//head' -v 'hello, world' template.html
<?xml version="1.0"?>
<!DOCTYPE html>
<html lang="en">
  <head>hello, world</head>
  <body>
    <div id="div1"/>
    <div id="div2"/>
  </body>
</html>

答案 2 :(得分:0)

好的,所以我要使用PHP,我将使用标准的字符串操作。我应该能够很好地利用explode来做这类事情。谢谢大家。