Удаление писем с использованием BeautifulSoup из списка URL - PullRequest
2 голосов
/ 23 сентября 2019

Ниже приведен простой скрипт, использующий BS для извлечения писем с одного веб-сайта. Как мне изменить скрипт, если у меня есть список URL-адресов, сохраненных в Excel и сохраненных результатов в CSV-файле?

ЯПодумываете, стоит ли мне читать список URL с помощью панд, чтобы он был преобразован в pd dataframe?

from bs4 import BeautifulSoup
import re
import csv
from urllib.request import urlopen

f = urlopen('http://www.nus.edu.sg/contact')

s = BeautifulSoup(f, 'html.parser')
s = s.get_text()

phone = re.findall(r"((?:\d{3}|\(\d{3}\))?(?:\s|-|\.)?\d{3}(?:\s|-|\.)\d{4})",s)
emails = re.findall(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,3}",s)

if len(phone) == 0:
    print ("Sorry, no phone number found.")

    print('------------')
    print ()
else :
    count = 1
    for item in phone:
        print ( count, ' phone number(s) found : ',item )
        count += 1

print('------------')
print()

if len(emails) == 0:
    print("Sorry, no email address found.")
    print('------------')
    print()
else:
    count = 1
    for item in emails:
        print(count, ' email address(es) found : ', item)
        count += 1

1 Ответ

1 голос
/ 23 сентября 2019

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

Код

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 :

Как проверить адрес электронной почты с помощью регулярного выражения?

...