Парсинг email адресов из текста web страницы
На данный момент использую следующий код:
import requests
from bs4 import BeautifulSoup as bs4
from fake_useragent import UserAgent
import re
headers = {'User-Agent': str(UserAgent().random)}
page_request = requests.get("страница сайта", headers=headers, timeout=30)
page_html = bs4(page_request.text, "html.parser")
emails = re.findall(r'[\w\.-]+@[\w\.-]+', page_html.text)
Проблема:
При такой реализации очень часто происходит ситуация, при которой, текст из разных тегов смешивается в одну строку, из-за чего парсинг email адресов может происходить некорректно (email адресу добавляется часть другого текста)
Вопрос:
Как можно исправить данную проблему?
Долгое время искал решение проблемы, но все примеры ограничиваются кодом, указанным выше
Ответы (1 шт):
Автор решения: Сергей Андреев
→ Ссылка
Мне помогло следующее решение:
def find_emails_on_a_page(html):
page_html = bs4(html, "html.parser")
tag_name_list = []
all_tags_list = page_html.findAll(True)
sentences = []
emails_list = []
for tag in all_tags_list:
if tag.name not in tag_name_list:
tag_name_list.append(tag.name)
for tag in tag_name_list:
list_of_all_tags_of_this_type = page_html.find_all(tag)
for individual_tag in list_of_all_tags_of_this_type:
if len(individual_tag.findChildren()) <= 1:
tag_emails = re.findall(r'[\w\.-]+@[\w\.-]+', individual_tag.text)
for email in tag_emails:
if email not in emails_list:
emails_list.append(email)
return emails_list
Возможно, не самый оптимальный вариант, но он работает.