Как заполнить множество ссылками, которые спарсил? Сейчас на выходе пустой сет
Пишу поисковый движок. Экспериментирую с вариантами поиска. Сейчас реализую поиск по образцу краулера. Вначале собираю страницы (по ним потом будем искать), через регулярки очищаю спарсенные ссылки и жду, что сет заполнится ссылками, но этого не случается. Почему? Привожу начало кода
main_url = f'http://www.zrg74.ru/'
# прописываем типы браузеров, с которыми будем работать
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
def get_page_text(url, user_agent, error_log=True):
headers = {'User-Agent': user_agent}
response = requests.get(url, headers=headers, allow_redirects=True)
if response.status_code == 200:
page_text = response.text
return page_text
elif error_log:
print(f'Ошибка! Response code: {response.status_code}')
print(f'URL: {url}')
return None
# собираем информацию со страницы:
page_text = get_page_text(main_url, USER_AGENT)
soup = BeautifulSoup(page_text)
# Очищаем ссылку — убираем лишние символы (например, уберем якоря а):
def clear_link(page_link):
page_link = re.sub('^\/', '', page_link) # находим символ "/" в начале строки и меняем его на пустой символ
# находим символы "#?"+"любой символ (кроме перевода строки)" - от одного раза и больше,
# меняем их на пустой символ:
page_link = re.sub('[\#\?].+', '', page_link)
return page_link
# все ссылки будем хранить во множестве:
links = set()
for a in soup.find_all('a'):
if not a.has_attr('href'):
continue
page_link = a.attrs['href']
if re.search('^(http)', page_link):
if main_url not in page_link or main_url == page_link:
continue
page_link = clear_link(page_link)
if len(page_link) == 0:
continue
page_link = main_url + page_link
links.add(page_link)
links
В данном методе на выходе получаю set() либо {'http://www.zrg74.ru/#'}. А вот такой код у меня ранее сработал:
index=1
url = f'http://zrg74.ru/category/obshhestvo/page/{index}'
page_text = get_page_text(url, USER_AGENT)
from urllib.parse import urlparse
soup = BeautifulSoup(page_text)
posts_list = soup.find_all('div', {'class': 'jeg_post_excerpt'}) # jeg_post_excerpt jeg_readmore
counter = 0
for p in posts_list:
if not p.find('a').attrs['href'] is None:
lnk = p.find('a').attrs['href']
page_text = get_page_text(lnk, USER_AGENT)
if page_text is None:
continue
urlSplit = urllib.parse.urlsplit(lnk)
if counter == 0:
dir_path = 'data/raw_pages/' + urlSplit.netloc + '/'.join(urlSplit.path.split('/')[:-1])
makedirs(dir_path, exist_ok=False) # exist_ok=True - управление ошибкой
with open(dir_path + '/' + urlSplit.path.split('/')[-1], 'w', encoding='utf-8') as f:
f.write(page_text)
counter+=1
else:
with open(dir_path + '/' + urlSplit.path.split('/')[-1], 'w', encoding='utf-8') as f:
f.write(page_text)
Ответы (1 шт):
Автор решения: Сергей Шашко
→ Ссылка
Зачем так сложно? BeautifulSoup и без регулярок справляется. В русском сигменте утюба полно роликов про парсеры с помощью BeautifulSoup. Не поленисить их посмотреть для общего развития.
Ссылки на последние новости славного города З.
import requests
from bs4 import BeautifulSoup
main_url = f'http://www.zrg74.ru/'
# прописываем типы браузеров, с которыми будем работать
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
def get_page_text(url, user_agent, error_log=True):
headers = {'User-Agent': user_agent}
response = requests.get(url, headers=headers, allow_redirects=True)
if response.status_code == 200:
with open('test.html', 'w', encoding='utf-8') as output_file:
output_file.write(response.text)
page_text = response.text
return page_text
elif error_log:
print(f'Ошибка! Response code: {response.status_code}')
print(f'URL: {url}')
return None
page_text = get_page_text(main_url, USER_AGENT)
soup = BeautifulSoup(page_text, 'lxml')
links = soup.find('div', class_="jeg_posts jeg_load_more_flag").find_all('h3', class_="jeg_post_title")
for link in links:
print (link.find('a').get('href'))