【问题标题】:Comparing HTML with difflib比较 HTML 和 difflib
【发布时间】:2016-05-22 20:30:05
【问题描述】:

我希望获得this 页面的仅内容(结构变化很少,因此可以忽略)的可靠差异。更具体地说,我需要进行的唯一更改是添加了一个新的指令 ID:

为了了解 difflib 会产生什么,我首先对两个 相同 HTML 内容进行比较,希望什么也得不到:

url = 'https://secure.ssa.gov/apps10/reference.nsf/instructiontypecode!openview&restricttocategory=POMT'
response = urllib.urlopen(url
content = response.read()
import difflib
d = difflib.Differ()

diffed = d.compare(content, content)

由于 difflib 模仿 UNIX diff 实用程序,我希望 diffed 不包含任何内容(或给出一些序列相同的迹象,但如果我 '\n'.join diffed ,我得到something resembling HTML,(虽然它不在浏览器中呈现)

确实,如果我采用区分两个字符的最简单情况:

diffed = d.compare('a', 'a')

diffed.next() 产生以下内容:

'  a'

所以我要么期望 difflib 提供一些它不能或不会提供的东西(我应该改变策略),还是我在滥用它?区分 HTML 的可行替代方案是什么?

【问题讨论】:

    标签: python html python-2.7 string-comparison difflib


    【解决方案1】:

    Differ.compare() 的参数应该是字符串序列。如果您使用两个字符串,它们将被视为序列,因此逐个字符进行比较。

    所以你的例子应该改写为:

    url = 'https://secure.ssa.gov/apps10/reference.nsf/instructiontypecode!openview&restricttocategory=POMT'
    response = urllib.urlopen(url)
    content = response.readlines()  # get response as list of lines
    import difflib
    d = difflib.Differ()
    
    diffed = d.compare(content, content)
    print('\n'.join(diffed))
    

    如果您只想比较 html 文件的内容,您可能应该使用解析器来处理它并只获取没有标签的文本,例如通过使用 BeautifulSoup 的 soup.stripped_strings:

    soup = bs4.BeautifulSoup(html_content)
    diff = d.compare(list(soup.stripped_strings), list_to_compare_to)
    print('\n'.join(diff))
    

    【讨论】:

    • 奇数:(i) 当我执行d.compare(content, content),其中content 现在是.readlines() 的输出而不是.read(),输出仍然是完整的HTML 文档,尽管相同内容,尽管每行由换行符分隔(ii)与您建议的 bs4 方法类似 - 当我将 list(soup.stripped_strings)list(soup.stripped_strings) 进行比较时,输出仍然是完整的 HTML 文档(已删除标签)。我在这里误会了什么?
    • Differ 就是这样工作的,它将返回整个文档,如果有更改,它们将以 -+ 为前缀,表示从输入 a 中删除的行并添加到输入 b。因此,如果两个输入相等,您将不会得到任何带有此类前缀的行。
    • 我明白了。谢谢。我已经把这些知识用在这里了。欢迎您对此提出想法:stackoverflow.com/q/35375004/1389110
    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 2013-08-12
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多