【问题标题】:how to using python to diff two html files如何使用python区分两个html文件
【发布时间】:2012-03-05 05:58:50
【问题描述】:

我想用 python 来区分两个 html 文件:

示例:

html_1 = """
<p>i love it</p>
"""
html_2 = """ 
<h2>i love it </p>
"""

差异文件会是这样的:

diff_html = """
<del><p>i love it</p></dev><ins><h2>i love it</h2></ins>
"""

有没有这样的python库帮我做这个?

【问题讨论】:

标签: python html diff


【解决方案1】:

lxml 可以做一些你想做的事情。来自文档:

>>> from lxml.html.diff import htmldiff
>>> doc1 = '''<p>Here is some text.</p>'''
>>> doc2 = '''<p>Here is <b>a lot</b> of <i>text</i>.</p>'''
>>> print htmldiff(doc1, doc2)
<p>Here is <ins><b>a lot</b> of <i>text</i>.</ins> <del>some text.</del> </p>

我不知道有任何其他 Python 库可用于此特定任务,但您可能希望逐字查看差异。它们可能近似于您想要的。

一个例子是this one,用PHP和Python实现(另存为diff.py,然后是import diff

>>> diff.htmlDiff(a,b)
>>> '<del><p>i</del> <ins><h2>i</ins> love <del>it</p></del> <ins>it </p></ins>'

【讨论】:

  • 我试过了,但我得到的是&gt;&gt;&gt; from lxml.html.diff import htmldiff &gt;&gt;&gt; doc1 = '''&lt;p&gt;Here is some text.&lt;/p&gt;''' &gt;&gt;&gt; doc2 = '''&lt;h2&gt;Here is some text.&lt;/h2&gt;''' &gt;&gt;&gt; print htmldiff(doc1, doc2) &lt;h2&gt;Here is some text.&lt;/h2&gt;
  • 我的标签 p 已更改为 chagne h2 ,但没有显示差异
  • lxml.html.diff 文档说:标记通常被忽略, 保留来自 new_html 的标记,可能还有一些来自 old_html 的标记(尽管认为丢失是可以接受的一些旧的标记)。只有 HTML 中的单词有差异。
  • 你说得对,它的效果比我记忆中的要差得多。我添加了一个替代方案,它不是您想要的,但可能会有所帮助。
  • 太好了!如果它对您有用,您应该将其作为答案发布并接受。
【解决方案2】:

我找到了两个有用的 python 库:

  1. htmltreediff
  2. htmldiff

但是,它们都使用 python 的 difflib 库来区分文本。但我想使用谷歌的 diff 。

【讨论】:

    【解决方案3】:

    结帐diff2HtmlCompare(完全披露:我是作者)。如果您只是想将差异可视化,那么这可能会对您有所帮助。如果您试图提取差异并对其进行处理,那么您可以按照其他人的建议使用 difflib(上面的脚本只是包装了 difflib 并使用 pygments 进行语法突出显示)。 Doug Hellmann 在详细说明如何使用 difflib 方面做得非常好,我建议您查看 his tutorial

    【讨论】:

      【解决方案4】:

      您可以使用difflib.ndiff() 查找“-”/“+”并将其替换为所需的 HTML。

      import difflib
      
      html_1 = """
      <p>i love it</p>
      """
      html_2 = """
      <h2>i love it </p>
      """
      
      diff_html = ""
      theDiffs = difflib.ndiff(html_1.splitlines(), html_2.splitlines())
      for eachDiff in theDiffs:
          if (eachDiff[0] == "-"):
              diff_html += "<del>%s</del>" % eachDiff[1:].strip()
          elif (eachDiff[0] == "+"):
              diff_html += "<ins>%s</ins>" % eachDiff[1:].strip()
      
      print diff_html
      

      结果:

      <del><p>i love it</p></del><ins><h2>i love it </p></ins>
      

      【讨论】:

        【解决方案5】:

        AFAIK,python 在difflib 中有一个可以做到这一点的构建。

        【讨论】:

          【解决方案6】:

          不完全是您的输出,但标准库 difflib 中有一个简单的 htmldiff 工具,它将为您构建一个 html diff 表。

          import difflib
          
          html_1 = """
          <p>i love it</p>
          """
          html_2 = """ 
          <h2>i love it </p>
          """
          
          htmldiff = difflib.HtmlDiff()
          html_table = htmldiff.make_table([html_1], [html_2]) # each item is a list of lines
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-29
            • 1970-01-01
            • 1970-01-01
            • 2013-01-01
            • 2023-03-18
            • 1970-01-01
            • 2017-07-22
            相关资源
            最近更新 更多