2015-02-23 3 views
0

Je suis nouveau sur Regex et je suis actuellement en train d'écrire un robot Scrapy pour collecter des adresses e-mail.Regex Sélectionnez différents formats d'e-mail en HTML

Je souhaite être en mesure de sélectionner différents formats de courriers électroniques lorsque j'effectue une exploration. En ce moment je trouve juste quelque chose avec un signe @ - mais je veux être un peu plus intelligent.

Comment sélectionner des e-mails avec les formats suivants?

  • [email protected]
  • info [at] par exemple [dot] com
  • info sur example.com informations
  • info at exemple dot com

Voici ce que je actuellement:

item['mail'] = hxs.select('//body//text()').re(r'[\w.-][email protected][\w.-]+') 
+0

Il est difficile d'écrire un regex correct pour les adresses e-mail. Voir [Utilisation d'une expression régulière pour valider une adresse e-mail] (http://stackoverflow.com/q/201323/1281433). Obtenir encore plus de formats, comme vous le demandez, sera encore plus difficile. Puisque les gens essaient généralement des formats comme les trois derniers pour éviter les scrapers (bien que ce ne soit pas particulièrement efficace), vous pouvez rencontrer une certaine résistance dans cette question. –

+0

Je sais, c'est pourquoi j'ai besoin d'aide - très nouveau dans ce domaine et mes recherches et tentatives ont jusqu'ici travaillé. C'est pourquoi j'ai besoin de quelqu'un d'expérimenté. –

+0

En ce qui concerne le lien ci-dessus - je n'essaie pas de valider l'e-mail. Je n'ai jamais dit cela, j'essaie juste de trouver un motif qui correspond à ceux ci-dessus sur la page et de les collecter. –

Répondre

0

C'est le meilleur que je peux trouver, mais j'ai vraiment Je ne sais pas si cela fonctionnera pour vous, à moins de fournir d'autres exemples.

Avec les exemples actuels dans votre question, cela fonctionne. Si vous ne vous souciez pas des adresses e-mail plus complexes, cela devrait vous convenir.

[\w.-]+ ?(?:@|\[?at]?) ?[\w.-]+(?: ?\[?dot]? ?[\w.-]+)? 

Alors qu'est-ce que je fais ici?
je mets dans une alternance au symbole @ afin qu'il puisse accepter [at] ou at en utilisant des espaces optionnels et supports avec les quantificateurs paresseux: ?

?(?:@|\[?at]?) ? 
^   ^
    lazy spaces 

Je l'ai fait similaire à la fin de l'expression, mais J'ai rendu l'ensemble du groupe non-capturable optionnel, car il serait en désordre avec les deux premières lignes dans vos emails exemple autrement.

https://regex101.com/r/aC4kW3/1

+0

Merci beaucoup! J'étais proche, je n'ai pas utilisé le? dans les endroits où vous les avez. Leçon apprise. –

+0

Il semble fonctionner dans le programme que vous avez lié mais pas dans la pratique. Il s'agissait simplement de sélectionner des mots avec ou avec des espaces. –

+0

Tout dépend de vos données, de vos options, de la langue que vous utilisez, etc ... J'aurais besoin de plus de détails –