2016-02-11 2 views
0

Я ищу, чтобы получить надежные отличия только контент (структурные изменения будут редкими и поэтому могут быть проигнорированы) страницы this. Более конкретно, единственное изменение, мне нужно, чтобы забрать новый Instruction ID добавил:Сравнение HTML с difflib

enter image description here

Чтобы получить ощущение, что 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'.joindiffed, я получаю something resembling HTM L, (хотя это не делает в браузере)

В самом деле, если я простейший случай возможного из сравнивает два символа:

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

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

Нечетные: (я), когда я выполнить '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

Смежные вопросы