【问题标题】:Merge two HTML files into master HTML file将两个 HTML 文件合并为主 HTML 文件
【发布时间】:2013-11-20 22:15:46
【问题描述】:

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

【问题讨论】:

  • 仅供参考,如果您只是将两个文件连接在一起,那么它们将在大多数浏览器中一个接一个地显示。或者,您可以创建一个“主”HTML 文件,它将在框架中加载这些文件中的每一个。
  • 是的,但这不是我需要做的选择。

标签: html linux join merge


【解决方案1】:

使用pandoc 进行合并,例如当前目录下的所有html文件:

pandoc -s *.html -o output.html

【讨论】:

  • 这样生成的文档中的html链接不起作用。
【解决方案2】:

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

【讨论】:

  • 我不得不将所有的源文件编码更改为 UTF-8,但在那之后它就很有吸引力了!谢谢!
  • 在编码为中文“GB2312”时不起作用:(也没有源代码,所以无法更正。
  • 程序的自述文件中列出了支持的编码。它们目前包括 ISO-8859-1/2/3、Windows-1250/1/2/3、UTF-16、UTF-16BE、UTF-8。一些 html 文件没有指定编码,并且包含默认不允许它们被视为 UTF-8 的字符。
  • 添加对亚洲字符集的支持并非易事,因为程序使用自定义 HTML 解析器,输入文件可能有不同的编码。这意味着修复需要为 GB2312 添加您自己的转码例程和表格。此外,html-merge 始终输出 UTF-8,部分原因是同样需要为不同编码的输入选择一种通用编码。 UTF-16 会为欧洲语言生成更大的文件。
【解决方案3】:

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

【讨论】:

  • 这是什么诡计?我以前从未听说过 XSLT……很有趣。我将对此进行研究,如果我可以创建一个工作脚本,我会接受这个答案(除非有人提供了一个不错的 Linux 命令)。谢谢。
  • 这只有在你所有的真实 HTML 文件也是格式良好的 XML 时才有效(即它们遵循 XML 的语法规则)。
  • 我的 HTML 文件(我正在尝试合并)由另一个应用程序生成,但它们似乎格式正确。
  • 有时可以用xmllint“修复”混乱的HTML
  • 请您告诉我您是如何使用 XSLT 做到这一点的。能否分享一下你用来解决这个问题的脚本链接或方法。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2011-03-27
      相关资源
      最近更新 更多