假设我有以下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文件。
答案 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
进入终端。 >>将文件中的代码附加到另一个代码中。