2017-02-17 3 views
0

J'essaie d'extraire des e-mails à partir de pages web, voici ma fonction email grabber:InvalidSchema: Aucun adaptateur de connexion ont été trouvés 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 

Cette fonction doit être alimenté par une autre fonction, qui crée un liste d'URL. Fonction d'alimentation:

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 

Elle continue avec de nombreuses exceptions, qui si elle est augmentée - renvoie une liste vide (non importante). retour Cependant la valeur de get_links() ressembler à ceci:

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

Bien sûr, il y a beaucoup de liens dans la liste (ne peut pas l'afficher - réputation). fonction emlgrb() ne sont pas en mesure de traiter la liste (InvalidSchema: Aucun adaptateur de connexion ont été trouvés) Toutefois, si je supprimer manuellement guillemets b et redondants - donc la liste ressemble à ceci:

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

emlgrb() fonctionne. Toute suggestion où est le problème ou de créer "fonction de nettoyage" pour obtenir la deuxième liste de la première - sont les bienvenus.

Merci

+0

A quoi ressemble la sortie si vous supprimez .encode ('ascii')? –

+0

En fait, fonctionne bien - merci. – scagbackbone

+0

Je pense que dans str() vous pouvez aussi spécifier un encodage? Si vous en avez besoin;) –

Répondre

0

La solution est de laisser tomber .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 

Vous pouvez ajouter le codage dans str() comme in this pydoc: str(object=b'', encoding='utf-8', errors='strict')

C'est parce que les appels str() .__repr__() ou .__str__() sur le object, ainsi s'il s'agit d'octets, la sortie est "b'string'". En fait, c'est ce qui est imprimé quand vous faites print(bytes_obj). Et en appelant .ecnode() sur un objet str crée un objet octets!