#python #парсер #url #urllib
Задача стоит такая: Сверка ссылок по домену(*) из TXT №2 с TXT №1 Сохранение уникальны ссылок в отдельный TXT №3 Добавление уникальных ссылок в TXT №1 При сверке по доменам - идет сверка только доменов сайта без: http:// и без https:// , так же при сверке по домену не учитывается все что после доменной зоны (.com , .ru , и т.п.) Я разделил программу на подзадачи и написал код на python 3.8: Подзадачи: Исходные данные: 1.txt http://site.com/ https://sit1e.com/vwdsvdfw/vwdefei/userpanel?cid=2 https://site.com/index.php?id=1 http://sit2e.com/ http://site.com/vwifow/fwviiwf? 2.txt http://site.com/ https://sit1e213.com/vwdsvdfw/vwdefei/userpanel?cid=2 https://site.com/index.php?id=1 http://sit222e.com/ http://site.com/vwifow/fwviiwf? 1) Достать домены: import re f1 = open('1.txt') f2 = open('2.txt') filevar1 = f1.read() filevar2 = f2.read() domains1 = re.findall(r'\/\/([\w\-]+)', filevar1) domains2 = re.findall(r'\/\/([\w\-]+)', filevar2) #Вывод доменов с новой строки with open('domains1.txt','w') as out: for domen in domains1: print(domen,file=out) with open('domains2.txt','w') as out: for domen in domains2: print(domen,file=out) f1.close() f2.close() input('Нажмите Enter, чтобы выйти из программы') Результат работы участка кода: domains1.txt site sit1e site sit2e site domains2.txt site sit1e213 site sit222e site 2) Сравнить домены: import re def diff(): with open('result1.txt') as text_one, \ open('result2.txt') as text_two: return set(text_one) ^ set(text_two) if __name__ == '__main__': with open('output.txt', 'w') as result: for i in diff(): result.write(i) input('Нажмите Enter, чтобы выйти') Выходные данные: output.txt sit1e sit2e sit1e213 sit222e 3) Найти исходные строки по выделенным доменам в исходных файлах и записать их в отдельный файл. с этим возникают проблемы. Не знаю какую регулярную функцию использовать. PS: пока искал ответ на свой вопрос, то заметил, что моя программа не учитывает субдомены, вроде для этого уже существует специальная функция в python: urlparse, но я не могу понять как ее использовать. Можно ли как-то сократить код программы, чтобы не писать 3-й блок программы? Можно-ли реализовать эту задачу проще?
Ответы
Ответ 1
Для чтения доменов из файлов со ссылками можно использовать следующую функцию: from urllib.parse import urlparse def get_domains(filename): with open(filename) as f: return ['.'.join(urlparse(line.strip()).netloc.split('.')[:-1]) for line in f] Проверка: dom1 = get_domains(r'C:\temp\1.txt') dom2 = get_domains(r'C:\temp\2.txt') print(dom1) # ['site', 'sit1e', 'site', 'sit2e', 'site'] print(dom2) # ['site', 'sit1e213', 'site', 'sit222e', 'site'] Работа со списками доменов как со множествами - объединение, пересечение, симметрическая разность: In [31]: set(dom1) | set(dom2) Out[31]: {'sit1e', 'sit1e213', 'sit222e', 'sit2e', 'site'} In [32]: set(dom1) & set(dom2) Out[32]: {'site'} In [33]: set(dom1) ^ set(dom2) Out[33]: {'sit1e', 'sit1e213', 'sit222e', 'sit2e'} Поиск ссылок по списку доменов: import re def search_domains(filename, doms): with open(filename) as f: text = f.read() pat = r'(https?://[^./\r\n]*?\b(?:{})\b[^\r\n]*)'.format('|'.join(doms)) return re.findall(pat, text) Проверка: In [47]: doms = set(dom1) ^ set(dom2) In [48]: doms Out[48]: {'sit1e', 'sit1e213', 'sit222e', 'sit2e'} In [49]: search_domains(r'C:\temp\1.txt', doms) Out[49]: ['https://sit1e.com/vwdsvdfw/vwdefei/userpanel?cid=2', 'http://sit2e.com/'] In [50]: search_domains(r'C:\temp\2.txt', doms) Out[50]: ['https://sit1e213.com/vwdsvdfw/vwdefei/userpanel?cid=2', 'http://sit222e.com/'] PS с записью результатов в файл я думаю вы справитесь сами.
Комментариев нет:
Отправить комментарий