我试图在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'
也很有帮助。
谢谢大家!
答案 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)))