将两个HTML文件合并为主HTML文件

时间:2013-11-08 19:21:34

标签: html linux join merge

假设我有以下HTML文件:

html1.html

<html>
  <head>
    <link href="blah.css" rel="stylesheet" type="text/css" />
  </head>
  <body>
    <div>this here be a div, y'all</div>
  </body>
</html>

html2.html

<html>
  <head>
    <script src="blah.js"></script>
  </head>
  <body>
    <span>this here be a span, y'all</span>
  </body>
</html>

我想获取这两个文件并制作一个如下所示的主文件:

<html>
  <head>
    <link href="blah.css" rel="stylesheet" type="text/css" />
    <script src="blah.js"></script>
  </head>
  <body>
    <div>this here be a div, y'all</div>
    <span>this here be a span, y'all</span>
  </body>
</html>

使用简单的Linux命令可以实现吗?我试过看join,但看起来像是在一个共同的领域加入,我不一定会有共同的领域...我只需要基本上添加差异,但也有主结构仍然完好无损(我想这可以称为左连接?)。看起来cat看起来不会......通过附加一个文件然后下一个文件进行合并等等。

如果没有简单的Linux命令,我的下一步是编写一个逐行比较两个脚本的脚本,或创建一个以某种方式引用这两个单独文件的主HTML文件。

4 个答案:

答案 0 :(得分:4)

您的示例文件是格式良好的XHTML。优秀!这意味着您可以使用简单的XSLT脚本。见How to merge two XML files with XSLT

答案 1 :(得分:4)

您可以使用html-merge工具合并多个HTML文件,保留其内部超文本链接。这是一个win32程序,但你可以使用Wine在linux中运行它。下载页面:https://sourceforge.net/projects/htmlmg/files/

答案 2 :(得分:0)

这是一个使用Python的lxml库的简单解决方案,尽管它只会复制body所选的child::*标签的子元素,而不是文本节点,而这需要进行修改{ {1}}和一些处理附加文本节点的额外逻辑。

child::node()

将其保存到文件#!/usr/bin/python3 import sys, os from lxml.html import tostring, parse if len(sys.argv) < 2: print("Usage: merge.py [file1] ... [filen] [outfile]") if os.path.isfile(sys.argv[-1]): if input('Override? (y/n) ' + sys.argv[-1]) != 'y': sys.exit(0) def tostr(n): try: return tostring(n) except: return str(n) tree = parse(sys.argv[1]) for f in sys.argv[2:-1]: print(f) tree2 = parse(f) for n in tree2.xpath('//head/child::*'): if all([tostr(n) != tostr(n2)\ for n2 in tree2.xpath('//head/child::*')]): tree.xpath('//head')[0].append(n) for n in tree2.xpath('//body/child::*'): tree.xpath('//body')[0].append(n) tree.write(sys.argv[-1]) 并运行merge.py

chmod +x merge.py

如果失败,则一个或多个文件格式错误,需要手动修复,或使用Usage: merge.py [file1] ... [filen] [outfile] htmllint修复。

答案 3 :(得分:0)

我发现不使用任何其他程序的最快方法是: cat html2.html >> html1.html 这会将html2.html添加到html1.html的末尾,或者如果您希望将它们都放在一个新文件中,则可以键入 cat html1.html >> html3.html && cat html2.html >> html3.html 进入终端。 >>将文件中的代码附加到另一个代码中。