删除重复的电子邮件

时间:2016-04-15 23:34:32

标签: python regex email web-scraping scrapy

我试图在scrapy中使用正则表达式来查找页面上的所有电子邮件地址。

我正在使用此代码:

    item["email"] = re.findall('[\w\.-]+@[\w\.-]+', response.body)

几乎完美无缺:它抓取所有电子邮件并将它们发给我。但是我想要的是:即使有多个同一个电子邮件地址,它在实际解析之前也没有给我重复。

我得到这样的回答(这是正确的):

{'email': ['billy666@stanford.edu',
           'cantorfamilies@stanford.edu',
           'cantorfamilies@stanford.edu',
           'cantorfamilies@stanford.edu',
           'footer-stanford-logo@2x.png']}

但是我想只显示

的唯一地址
{'email': ['billy666@stanford.edu',
           'cantorfamilies@stanford.edu',
           'footer-stanford-logo@2x.png']}

如果你想投入如何只收集电子邮件而不是

'footer-stanford-logo@2x.png'

也很有帮助。

谢谢大家!

3 个答案:

答案 0 :(得分:2)

item["email"] = set(re.findall('[\w\.-]+@[\w\.-]+', response.body))

答案 1 :(得分:2)

以下是你如何摆脱欺骗和'footer-stanford-logo@2x.png' - 在你的输出中的类似东西:

import re
p = re.compile(r'[\w.-]+@(?![\w.-]*\.(?:png|jpe?g|gif)\b)[\w.-]+\b')
test_str = "{'email': ['billy666@stanford.edu',\n           'cantorfamilies@stanford.edu',\n           'cantorfamilies@stanford.edu',\n           'cantorfamilies@stanford.edu',\n           'footer-stanford-logo@2x.png']}"
print(set(p.findall(test_str)))

请参阅Python demo

正则表达式看起来像

[\w.-]+@(?![\w.-]*\.(?:png|jpe?g|gif)\b)[\w.-]+\b
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^       ^^

请参阅demo

否定前瞻(?![\w.-]*\.(?:png|jpe?g|gif)\b)将禁止所有与png末尾的jpg\b等扩展名匹配是一个单词边界,在这种情况下,它是一个尾随单词边界。)

可以使用set轻松删除Dupes - 这是最麻烦的部分。

最终解决方案

item["email"] = set(re.findall(r'[\w.-]+@(?![\w.-]*\.(?:png|jpe?g|gif)\b)[\w.-]+\b', response.body))

答案 2 :(得分:1)

你不能只使用一套而不是一个清单吗?

item["email"] = set(re.findall('[\w\.-]+@[\w\.-]+', response.body))

如果你真的想要一个清单,那么:

item["email"] = list(set(re.findall('[\w\.-]+@[\w\.-]+', response.body)))