#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 с записью результатов в файл я думаю вы справитесь сами.
Комментариев нет:
Отправить комментарий