2017-03-24 2 views
1

Je suis assez nouveau à la programmation donc je m'excuse si ma question est trop triviale. J'ai récemment suivi des cours d'Udacity comme «Intro to Computer Science», «Programmer des fondations avec Python» et d'autres.Comment puis-je améliorer ce morceau de code (grattage avec Python)?

L'autre jour, mon patron m'a demandé de collecter des adresses e-mail de certains sites Web. Certains d'entre eux avaient de nombreuses adresses sur la même page, la cloche sonnait et je pensais à créer mon propre code pour faire la tâche répétitive de collecter les e-mails et de les coller dans une feuille de calcul. Donc, après avoir passé en revue quelques-unes des leçons de ces corses et quelques vidéos sur YouTube, j'ai trouvé ce code. Notes: Il est écrit en Python 2.7.12 et j'utilise Ubuntu 16.04.

import xlwt 
from bs4 import BeautifulSoup 
import urllib2 

def emails_page2excel(url): 
    # Create html file from a given url 
    sauce = urllib2.urlopen(url).read() 
    soup = BeautifulSoup(sauce,'lxml') 

    # Create the spreadsheet book and a page in it 
    wb = xlwt.Workbook() 
    sheet1 = wb.add_sheet('Contacts') 

    # Find the emails and write them in the spreadsheet table 
    count = 0 
    for url in soup.find_all('a'): 
    link = url.get('href') 
    if link.find('mailto')!=-1: 
     start_email = link.find('mailto')+len('mailto:') 
     email = link[start_email:] 
     sheet1.write(count,0,email) 
     count += 1 

    wb.save('This is an example.xls') 

Le code fonctionne bien et c'est assez rapide. Cependant, je voudrais l'améliorer dans ces façons:

  • j'ai eu le sentiment que la boucle pourrait être fait d'une façon plus élégante façon . Existe-t-il un autre moyen de rechercher l'e-mail en dehors de la recherche de chaîne? Juste d'une manière similaire dans laquelle trouvé les balises «a»?
  • Je voudrais être en mesure d'évaluer ce code avec une liste de sites Web (très probablement dans une feuille de calcul) au lieu de l'évaluer uniquement avec une chaîne d'URL. Je n'ai pas encore eu le temps de faire des recherches sur la façon de le faire, mais toute suggestion est la bienvenue.
  • Dernier point, mais non des moindres, je voudrais savoir s'il existe un moyen d'implémenter ce script dans une sorte de mini-programme convivial . Je veux dire, par exemple, mon patron est totalement mauvais sur les ordinateurs: je ne peux pas l'imaginer ouvrir un shell terminal et exécuter le code python. Au lieu de cela, j'aimerais créer un programme dans lequel elle pourrait simplement coller l'URL, ou télécharger une feuille de calcul avec les sites Web dont elle souhaite extraire les e-mails, choisir si elle souhaite extraire des e-mails ou d'autres informations. cliquez sur un bouton et obtenez le résultat.

J'espère que je me suis exprimé clairement. Merci à l'avance,

Anqin

+0

Je vote pour clore cette question hors-sujet parce qu'elle semble mieux convenir à http://codereview.stackexchange.com/ – Stedy

Répondre

0

En ce qui BeautifulSoup vous va peut rechercher des e-mails à a de trois façons:

1) Utilisez find_all avec un lambda pour rechercher tous les tags a et ont href en tant qu'attribut et sa valeur est mailto.

for email in soup.find_all(lambda tag: tag.name == "a" and "href" in tag.attrs and "mailto:" in tag.attrs["href"]): 
print (email["href"][7:]) 

2) Utilisez find_all avec regex pour trouver mailto: dans une balise a.

for email in soup.find_all("a", href=re.compile("mailto:")): 
    print (email["href"][7:]) 

3) Utilisez select pour trouver une balise a sur laquelle son attribut href commence par mailto:.

for email in soup.select('a[href^=mailto]'): 
    print (email["href"][7:]) 

Ceci est ma préférence personnelle, mais je préfère utiliser requests sur urllib. Beaucoup plus simple, mieux à la manipulation d'erreur et plus sûr lors de l'enfilage.

En ce qui concerne vos autres questions, vous pouvez créer une méthode pour aller chercher, analyser et retourner les résultats que vous voulez et passer une URL en tant que paramètre. Vous auriez seulement besoin de boucler votre liste d'URL et d'appeler cette méthode. Pour votre question de patron, vous devez utiliser un GUI.

Amusez-vous à coder.

+0

Merci pour l'information, Zroq. Je dois gérer qu'il m'a fallu du temps pour comprendre toutes vos suggestions. Mais j'apprends beaucoup, merci! – Anqin