2017-02-17 6 views
0

Я пытаюсь извлечь сообщения электронной почты с веб-страниц, вот мой адрес электронной почты граббер функция:InvalidSchema: Нет подключения адаптеров не были найдены python3.5.2

def emlgrb(x): 
    email_set = set() 
    for url in x: 
     try: 
      response = requests.get(url) 
      soup = bs.BeautifulSoup(response.text, "lxml") 
      emails = set(re.findall(r"[a-z0-9\.\-+_][email protected][a-z0-9\.\-+_]+\.[a-z]+", soup.text, re.I)) 
      email_set.update(emails) 
     except (requests.exceptions.MissingSchema, requests.exceptions.ConnectionError): 
     continue 
    return email_set 

Эта функция должна быть подана через другую функцию, которая создает список url. Функция фидера:

def handle_local_links(url, link): 
    if link.startswith("/"): 
     return "".join([url, link]) 
    return link 

def get_links(url): 
    try: 
     response = requests.get(url, timeout=5) 
     soup = bs.BeautifulSoup(response.text, "lxml") 
     body = soup.body 
     links = [link.get("href") for link in body.find_all("a")] 
     links = [handle_local_links(url, link) for link in links] 
     links = [str(link.encode("ascii")) for link in links] 
     return links 

Он сохраняется за многими исключениями, которые, если подняты, возвращают пустой список (не важно). Однако возвращать значение из get_links() выглядит следующим образом:

["b'https://pythonprogramming.net/parsememcparseface//'"] 

, конечно, есть много ссылок в списке (не могу разместить его - репутацию). Функция emlgrb() не в состоянии обработать список (InvalidSchema: не было обнаружено ни одного подключения адаптеров) Однако, если я вручную удалить б и лишние кавычки - так что список выглядит следующим образом:

['https://pythonprogramming.net/parsememcparseface//'] 

emlgrb() работает. Любое предложение, где проблема или проблема создания «функции очистки» для получения второго списка с первого раза, приветствуется.

Благодаря

+0

Как выглядит вывод, если вы уроните .encode ('ascii')? –

+0

На самом деле, хорошо работает - спасибо. – scagbackbone

+0

Я думаю, что в str() вы также можете указать кодировку? Если вам это нужно;) –

ответ

0

Решение отказаться от .encode('ascii')

def get_links(url): 
    try: 
     response = requests.get(url, timeout=5) 
     soup = bs.BeautifulSoup(response.text, "lxml") 
     body = soup.body 
     links = [link.get("href") for link in body.find_all("a")] 
     links = [handle_local_links(url, link) for link in links] 
     links = [str(link) for link in links] 
     return links 

Вы можете добавить кодирование в str() как in this pydoc: str(object=b'', encoding='utf-8', errors='strict')

Это потому, что ул() вызывает .__repr__() или .__str__() на object, таким образом, если это байты, то вывод равен "b'string'". На самом деле это то, что печатается, когда вы делаете print(bytes_obj). И вызов .ecnode() на объект str создает объект байтов!

Смежные вопросы