2016-02-11 68 views
0

我期待獲得內容的可靠差異(結構性更改將是罕見的,因此可以忽略)的this頁面。更具體地講,我需要拿起唯一的變化是增加了一個新的指令ID:比較HTML和difflib

enter image description here

爲了獲得所difflib會產生,我第一次diff的2項相同 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'.joindiffed,我得到something resembling HTM L,(雖然它不會在瀏覽器中渲染)

事實上,如果我拿最簡單的情況可能版本比較兩個漢字:

diffed = d.compare( '一個', 'A')

diffed.next()產生以下:

' a' 

因此,我期望任someth從difflib,它不能或不會提供(我應該改變粘性),還是我濫用它?什麼是可行的替代方法來區分HTML?

回答

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)) 
... 
+0

奇數:(i)當我執行'd.compare(內容,內容)',其中'content'現在'.readlines的輸出()'而不是'。 read()',輸出仍然是完整的HTML文檔,儘管內容相同,儘管每行都用換行符隔開(ii)同樣,使用您建議的bs4方法 - 比較list(soup.stripped_strings)和list (soup.stripped_strings)',輸出仍然是完整的HTML文檔(標籤被刪除)。我在這裏誤解了什麼? – Pyderman

+0

這就是[Differ](https://docs.python.org/3/library/difflib.html#difflib.Differ)的工作方式,它會返回整個文檔,如果有變化,它們將以' -'或'+'表示從輸入a中刪除並添加到輸入b中的行。所以如果兩個輸入相等,你就不會得到任何帶這樣的前綴的行。 – mata

+0

我明白了。謝謝。我已經把這些知識用在這裏。我歡迎你的想法:http://stackoverflow.com/q/35375004/1389110 – Pyderman