Парсинг 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

Возможно, не самый оптимальный вариант, но он работает.

→ Ссылка