17

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

5 回答 5

8

使用pandoc合并当前目录中的所有 html 文件:

pandoc -s *.html -o output.html
于 2017-05-08T07:56:58.807 回答
5

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

于 2014-07-11T14:49:09.630 回答
4

您的示例文件是格式良好的 XHTML。出色的!这意味着您可以使用简单的 XSLT 脚本。请参阅如何使用 XSLT 合并两个 XML 文件

于 2013-11-08T19:29:04.953 回答
1

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

于 2020-08-14T02:31:47.083 回答
0

这是一个使用 Pythonlxml库的简单解决方案,尽管它只会复制body标签 selected的子元素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]

如果失败,则一个或多个文件格式错误,需要手动或使用htmllint或修复hxnormalize

于 2019-12-11T23:31:13.273 回答