Python Regex Webcrawling, получить двойной результат, нужен только один - PullRequest
0 голосов
/ 21 апреля 2020

Я работаю над базовой c python программой для сканирования веб-страниц до go на веб-сайт, читаю адреса электронной почты и показываю это как вывод. Я получаю правильный ответ, но он дублируется. Можете ли вы помочь исправить это?

Вот программа:

from re import findall
import urllib.request

url = "https://www.uta.edu/academics/schools-colleges/business/admissions-and-advising/cob-advising"

print("Email addresses for advisors:")

response = urllib.request.urlopen(url)

html = response.read()

htmlStr = html.decode()

pdata = findall(r"[A-Za-z0-9._%+-]+"
                     r"@[A-Za-z0-9.-]+"
                     r"\.[A-Za-z]{2,4}", htmlStr)

for item in pdata:
    print(item)

Ответы [ 3 ]

0 голосов
/ 21 апреля 2020
for item in list(dict.fromkeys(pdata)):
    print(item)

"dict.fromkeys (pdata)" импортирует элементы списка в его ключ. (В этом случае значение будет Нет). При импорте то же значение ключа будет игнорироваться. В конце списка (dict.fromkeys (pdata)) будут удалены дублирующиеся элементы.

0 голосов
/ 21 апреля 2020

Вы получаете каждый адрес электронной почты дважды, потому что ваш веб-сайт содержит каждый адрес электронной почты два раза. Вы можете преобразовать свой список в набор, чтобы получить только уникальные предметы. Затем вы можете преобразовать его обратно в список, если вам нужны результаты в списке:

pdata = list(set(pdata))
0 голосов
/ 21 апреля 2020

В файле html есть две копии всех электронных писем (одна в тексте, а другая в атрибуте href). Вот пример этого случая:

<a href="mailto:micah.washington@uta.edu" class="uta-btn uta-btn-ghost">
<span>micah.washington@uta.edu</span>
</a>

Стандартным способом было бы использовать парсер, чтобы получить только текст html, а не атрибуты / теги. Но здесь самый простой способ - это напечатать любой другой элемент:

for item in pdata[::2]:
    print(item)

А вот более стандартный способ сделать это, используя парсер BeautifulSoup html, где div.text извлекает текст html и удаляет теги и атрибуты:

from re import findall
import urllib.request
from bs4 import BeautifulSoup as bs

url = "https://www.uta.edu/academics/schools-colleges/business/admissions-and-advising/cob-advising"

print("Email addresses for advisors:")

response = urllib.request.urlopen(url)

div = bs(response, 'html5lib')

pdata = findall(r"[A-Za-z0-9._%+-]+"
                     r"@[A-Za-z0-9.-]+"
                     r"\.[A-Za-z]{2,4}", div.text)

for item in pdata:
    print(item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...