Использование RegEx для идентификации писем от Beautiful Soup - PullRequest
0 голосов
/ 04 апреля 2020

Я новичок, работающий над программой, которая может очищать электронные письма с данного сайта. Код выглядит следующим образом:

import requests, bs4, re
print('Fetching Website...')
res = requests.get('https://examplewebsite.com')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')
type(soup)

my_list = []
for link in soup.find_all('a'):
    my_list.append(link.get('href'))

emailregex = re.compile(r'''(
    [a-zA-Z0-9._%+-:]+
    @
    [a-zA-Z0-9.-]+
    \.[a-zA-Z]{2,4}
    )''', re.VERBOSE)

newlist = list(filter(emailregex.search, my_list))
print(newlist)

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

Однако, когда я запускаю код, я получаю сообщение об ошибке: «TypeError: ожидаемая строка или байтовоподобный объект». Я обнаружил, что если я сделаю:

newlist = list(filter(emailregex.search, str(my_list)))
print(newlist)

Ошибка исчезнет go, но мой «новый список» не содержит результатов. Я подтвердил, что «my_list» возвращает список ожидаемых результатов. Я обнаружил, что если я распечатываю «my_list» и вставляю его содержимое в новый файл, где я добавляю его в список, запускаю тот же код, он работает просто отлично, поэтому я не верю, что это проблема с Regex. Я думаю, что это может быть что-то с типом данных в "my_list"? У меня нет хороших идей, поэтому любая помощь будет признательна.

Спасибо

Ответы [ 2 ]

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

"TypeError: expected string or bytes-like object" потому что my_list не включает только строку, однако str(my_list) собирается преобразовать переменную в большую строку

print(str(my_list)) # this is a string
print(type(str(my_list)))  # output: str

Вам необходимо изменить каждый элемент my_list в строку, а затем повторите попытку

my_list = list(map(str, my_list))
newlist = list(filter(emailregex.search, my_list))
0 голосов
/ 04 апреля 2020
import requests
from bs4 import BeautifulSoup
import re


def main(url):
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')
    target = "".join([item.get("href")
                      for item in soup.findAll("a", href=True)])
    matches = re.findall(
        r'''[a-zA-Z0-9._%+-:]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}''', re.VERBOSE, target)
    for match in matches:
        print(match)


main("https://www.example.com")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...