Creé un código para extraer correos electrónicos de sitios web:

import requests
from bs4 import BeautifulSoup
import re

url = ""
s = requests.Session()
r = s.get(url, headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"})
soup = BeautifulSoup(r.content, 'html.parser')

content = soup.get_text()
emails_match = re.findall(r'[\w\.-]+@[\w\.-]+', content)

Funciona bien, pero a veces devuelve correos electrónicos con otro texto dentro de otro elemento. Por ejemplo, si probamos el código en este sitio web: https://alliedsinterings.com/ devolverá el número de teléfono más el correo electrónico:

print(email_match)
['743-2538info@alliedsinterings.com']

Quiero obtener solo la dirección de correo electrónico (sin ningún texto de otros elementos html)

Cuando intento otra expresión regular, devuelve lo mismo, por ejemplo:

r'([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+){0,}'
0
max scender 22 ago. 2020 a las 09:09

1 respuesta

La mejor respuesta

Utilice .strings en lugar de .text

import re

email = re.compile(r'([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+){0,}')

[x for x in soup.strings if email.search(x).group()]

['info@alliedsinterings.com']
1
sushanth 22 ago. 2020 a las 06:20