Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # помощь в парсинге сайта www.iso.org
- # код написан на коленке - прототип
- import requests
- from bs4 import BeautifulSoup
- # =================================================
- # логика разделена на три функции
- def get_main_links(url):
- """
- Функция для сбора корневых ссылок.
- Результат сохраняется в словарь 'temp'.
- """
- temp = {}
- response = requests.get(url)
- soup = BeautifulSoup(response.content, 'html.parser')
- table = soup.find('table', {'id': 'datatable-ics'})
- for tr in table.find_all('tr')[1:]:
- ics = tr.find_all('td')[0].get_text().strip()
- field = tr.find_all('td')[1].get_text().strip()
- link = 'https://www.iso.org' + tr.find_all('td')[0].find('a')['href']
- temp[ics] = {'field': field, 'link': link}
- return temp
- def get_all_links(data, table, bad, url):
- """
- ics, не имеющие ссылки, сохраняются в отдельный словарь ('bad')
- """
- for tr in table.find_all('tr')[1:]:
- ics = tr.find_all('td')[0].get_text().strip()
- field = tr.find_all('td')[1].get_text().strip()
- if tr.find_all('td')[0].find('a') is not None:
- link = 'https://www.iso.org' + tr.find_all('td')[0].find('a')['href']
- data.append(link)
- else:
- bad[ics] = {'field': field, 'url': url}
- def parse(url):
- """
- Функция для парсинга всех страниц и сбора ссылок на стандарты.
- Все стандарты сохраняются в список 'data'.
- Стандарты, у которых отсутствует описание, сохраняются в словарь 'bad'
- """
- # print(url)
- response = requests.get(url)
- soup = BeautifulSoup(response.content, 'html.parser')
- table = soup.find('table')
- table_id = soup.find('table')['id']
- if table_id == 'datatable-ics-projects':
- # если дошли до последнего уровня вложенности, то парсим данные (функцией)
- get_all_links(data, table, bad, url)
- else:
- # иначе собираем ссылки (той же функцией)
- temp_links = []
- get_all_links(temp_links, table, bad, url)
- for link in temp_links:
- parse(link)
- # =================================================
- # =================================================
- # test-1:
- # =================================================
- url_ics = 'https://www.iso.org/ru/standards-catalogue/browse-by-ics.html'
- main_links_ics = get_main_links(url_ics)
- print('test link:\t', main_links_ics['01']['link'])
- print('test field:\t', main_links_ics['01']['field'])
- print('=' * 30)
- for k, v in main_links_ics.items():
- print(v['link'])
- # =================================================
- # test-2:
- # =================================================
- data = []
- bad = {}
- parse('https://www.iso.org/ru/ics/01.html')
- print(len(data))
- # =================================================
- # старт:
- # =================================================
- data = []
- bad = {}
- url_ics = 'https://www.iso.org/ru/standards-catalogue/browse-by-ics.html'
- main_links_ics = get_main_links(url_ics)
- for k, v in main_links_ics.items():
- parse(v['link'])
- # =================================================
- # при желании результат (ссылки на стандарты) можно сохранить в файл
- # и потом по ним парсить полное описание каждого стандарта
- with open('links.csv', 'a') as file:
- for link in data:
- file.write(link + '\n')
- with open('bad_iso.csv', 'a') as file:
- for k, v in bad.items():
- file.write(f'"{k}";"{v["url"]}";"{v["field"]}"\n')
Add Comment
Please, Sign In to add comment