vmamontov

parse_www.iso.org

May 13th, 2022 (edited)
787
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # помощь в парсинге сайта www.iso.org
  2. # код написан на коленке - прототип
  3.  
  4. import requests
  5. from bs4 import BeautifulSoup
  6.  
  7.  
  8. # =================================================
  9. # логика разделена на три функции
  10.  
  11.  
  12. def get_main_links(url):
  13.     """
  14.    Функция для сбора корневых ссылок.
  15.    Результат сохраняется в словарь 'temp'.
  16.    """
  17.     temp = {}
  18.  
  19.     response = requests.get(url)
  20.     soup = BeautifulSoup(response.content, 'html.parser')
  21.     table = soup.find('table', {'id': 'datatable-ics'})
  22.  
  23.     for tr in table.find_all('tr')[1:]:
  24.         ics = tr.find_all('td')[0].get_text().strip()
  25.         field = tr.find_all('td')[1].get_text().strip()
  26.         link = 'https://www.iso.org' + tr.find_all('td')[0].find('a')['href']
  27.        
  28.         temp[ics] = {'field': field, 'link': link}
  29.  
  30.     return temp
  31.  
  32.  
  33. def get_all_links(data, table, bad, url):
  34.     """
  35.    ics, не имеющие ссылки, сохраняются в отдельный словарь ('bad')
  36.    """
  37.    
  38.     for tr in table.find_all('tr')[1:]:
  39.         ics = tr.find_all('td')[0].get_text().strip()
  40.         field = tr.find_all('td')[1].get_text().strip()
  41.         if tr.find_all('td')[0].find('a') is not None:
  42.             link = 'https://www.iso.org' + tr.find_all('td')[0].find('a')['href']
  43.             data.append(link)
  44.         else:
  45.             bad[ics] = {'field': field, 'url': url}
  46.  
  47.  
  48. def parse(url):
  49.     """
  50.    Функция для парсинга всех страниц и сбора ссылок на стандарты.
  51.    Все стандарты сохраняются в список 'data'.
  52.    Стандарты, у которых отсутствует описание, сохраняются в словарь 'bad'
  53.    """
  54.     # print(url)
  55.  
  56.     response = requests.get(url)
  57.     soup = BeautifulSoup(response.content, 'html.parser')
  58.     table = soup.find('table')
  59.     table_id = soup.find('table')['id']
  60.     if table_id == 'datatable-ics-projects':
  61.         # если дошли до последнего уровня вложенности, то парсим данные (функцией)
  62.         get_all_links(data, table, bad, url)
  63.     else:
  64.         # иначе собираем ссылки (той же функцией)
  65.         temp_links = []
  66.         get_all_links(temp_links, table, bad, url)
  67.         for link in temp_links:
  68.             parse(link)
  69. # =================================================
  70.  
  71.  
  72.  
  73. # =================================================
  74. # test-1:
  75. # =================================================
  76. url_ics = 'https://www.iso.org/ru/standards-catalogue/browse-by-ics.html'
  77. main_links_ics = get_main_links(url_ics)
  78.  
  79. print('test link:\t', main_links_ics['01']['link'])
  80. print('test field:\t', main_links_ics['01']['field'])
  81. print('=' * 30)
  82.  
  83. for k, v in main_links_ics.items():
  84.     print(v['link'])
  85.  
  86. # =================================================
  87. # test-2:
  88. # =================================================
  89. data = []
  90. bad = {}
  91.  
  92. parse('https://www.iso.org/ru/ics/01.html')
  93. print(len(data))
  94.  
  95. # =================================================
  96. # старт:
  97. # =================================================
  98. data = []
  99. bad = {}
  100.  
  101. url_ics = 'https://www.iso.org/ru/standards-catalogue/browse-by-ics.html'
  102. main_links_ics = get_main_links(url_ics)
  103.  
  104. for k, v in main_links_ics.items():
  105.     parse(v['link'])
  106.  
  107. # =================================================
  108. # при желании результат (ссылки на стандарты) можно сохранить в файл
  109. # и потом по ним парсить полное описание каждого стандарта
  110.  
  111. with open('links.csv', 'a') as file:
  112.     for link in data:
  113.         file.write(link + '\n')
  114.  
  115. with open('bad_iso.csv', 'a') as file:
  116.     for k, v in bad.items():
  117.         file.write(f'"{k}";"{v["url"]}";"{v["field"]}"\n')
  118.  
RAW Paste Data Copied