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

20

假设我有以下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文件。


1
请注意,如果您只是将这两个文件连接在一起,它们将在大多数浏览器中依次显示。或者,您可以创建一个“主”HTML文件,在其中使用框架加载每个文件。 - mti2935
是的,但这不是我需要完成的选项。 - incutonez
5个回答

11
使用pandoc合并当前目录下的所有html文件:
pandoc -s *.html -o output.html

1
以这种方式生成的文档中的HTML链接无法正常工作。 - Att Righ
2022年,链接对我来说是有效的。但它会破坏布局。 - 丶 Limeー来夢 丶

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

我不得不将所有源文件编码更改为UTF-8,但之后它运行得非常好!谢谢! - Keyslinger
当编码为中文"GB2312"时,它无法工作 :( 也没有源代码,所以我无法进行更正。 - Shaohua Li
支持的编码方式在程序的README文件中列出。它们目前包括ISO-8859-1/2/3、Windows-1250/1/2/3、UTF-16、UTF-16BE和UTF-8。一些HTML文件没有指定编码方式,并且包含的字符不能默认地被视为UTF-8。 - bkxp
添加对亚洲字符集的支持并不容易,因为该程序使用自定义的HTML解析器,输入文件可能具有不同的编码方式。这意味着修复需要添加自己的转码例程和GB2312表。而且,html-merge总是输出UTF-8,部分原因是为了选择不同编码的输入的通用编码。UTF-16会生成更大的欧洲语言文件。 - bkxp

4

1
这是什么巧计?我以前从未听说过XSLT......有趣。我会研究一下,如果我能创建一个可行的脚本,我会接受这个答案(除非有人提供了一个好用的Linux命令)。谢谢。 - incutonez
只有在您的所有真实HTML文件也是格式良好的XML(即它们遵循XML的语法规则)的情况下,此方法才能正常工作。 - Robin Green
我的HTML文件(我正在尝试合并)是由另一个应用程序生成的,但它们似乎格式良好。 - incutonez
2
有时候可以使用 xmllint 来“修复”混乱的 HTML。 - el.pescado - нет войне
2
请问您可以告诉我如何使用XSLT来实现这个功能吗?您能分享一下解决这个问题所用的脚本链接或方法吗? - Alankar More

1
这里有一个简单的解决方案,它使用Python的lxml库,但它只会复制所选body标签的元素子节点child::*,而不是文本节点,需要修改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]

如果失败,一个或多个文件格式不正确,需要手动修复或使用 htmllinthxnormalize 进行修复。

0

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


一个更简单的方法是进入上一级目录,然后执行类似于 cat directory/*.html > merged_file.html 的命令。这个方法非常容易实现,但不幸的是它不符合问题的要求。 - Mark Chackerian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接