findAll / find_all может искать текст на основе шаблона регулярных выражений.
Вы можете использовать re.compile (шаблон электронной почты) , а затем передать его findAll .
findAll(text=email_pattern)
Используемый шаблон электронной почты соответствует RFC 5322 .
Скопирование электронной почты с одного URL
from bs4 import BeautifulSoup, Comment
import re
from urllib.request import urlopen
email_pattern = re.compile(r"""(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])""")
f = urlopen('http://www.nus.edu.sg/contact').read()
soup = BeautifulSoup(f, 'html5lib')
emails = [x for x in soup.findAll(text=email_pattern) if not isinstance(x, Comment)]
print(emails)
Вывод:
[' oarconnect@nus.edu.sg', ' ocssec@nus.edu.sg', ' dpo@nus.edu.sg', ' enterprise@nus.edu.sg', ' ohrsharedservices@nus.edu.sg', ' itcare@nus.edu.sg', ' askalib@nus.edu.sg', ' ofmhelp@nus.edu.sg', ' nus.comms@nus.edu.sg', ' whistleblow@nus.edu.sg']
Чтение URL-адресов из Excel и сохранение в формате CSV
Вы можете просто прочитать URL-адреса из столбца файла Excel, просмотреть каждый из них, получить электронные письма и записать в файл CSV.Вам не нужно использовать панды для этого (хотя вы можете).Вы можете использовать openpyxl для чтения в Excel.
website.xlsx
![enter image description here](https://i.stack.imgur.com/XavZD.png)
Код
from bs4 import BeautifulSoup, Comment
import re
import csv
from urllib.request import urlopen
from openpyxl import load_workbook
email_pattern = re.compile(r"""(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])""")
# The source xlsx file is named as source.xlsx
wb = load_workbook("websites.xlsx")
ws = wb.active
# Default name of first column is A
# change column if if you have a different column name
first_column = ws['A']
with open('output.csv', 'w') as output_file:
writer = csv.writer(output_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
for x in range(len(first_column)):
link = first_column[x].value.strip()
f = urlopen(link).read()
soup = BeautifulSoup(f, 'html5lib')
emails = [x for x in soup.findAll(text=email_pattern) if not isinstance(x, Comment)]
# Add the link also
emails.insert(0, link)
writer.writerow(emails)
output.csv
http://www.nus.edu.sg/contact, oarconnect@nus.edu.sg, ocssec@nus.edu.sg, dpo@nus.edu.sg, enterprise@nus.edu.sg, ohrsharedservices@nus.edu.sg, itcare@nus.edu.sg, askalib@nus.edu.sg, ofmhelp@nus.edu.sg, nus.comms@nus.edu.sg, whistleblow@nus.edu.sg
https://sloanreview.mit.edu/contact/,smrfeedback@mit.edu,smr-help@mit.edu
Ref :
Как проверить адрес электронной почты с помощью регулярного выражения?