【问题标题】:Python 3 email extracting search enginePython 3 电子邮件提取搜索引擎
【发布时间】:2013-11-19 23:25:24
【问题描述】:

问。编写一个搜索引擎,它将获取一个文件(如 html 源页面)并提取所有电子邮件地址。然后它将它们打印在有序列表中。该文件可能包含很多乱七八糟的文本(即asda@home 无效.. 文件中可能有很多@'s 在电子邮件以外的角色中!)

出于测试目的,这是我一直在使用的文本文件:

askdalsd
asd
sad
asd
asd
asd
ad
asd
asda
da
moi1990@gmail.com
masda@sadas
223@home.ca
125512@12451.cpm
domain@name.com
asda
sda
as
da
ketchup@ketchup@#%@#.com
onez!es@gomail.com
asdasda@@@@@email.com
asda@asdasdaad.ca
moee@gmail.com

这就是我目前所拥有的:

import os
import re
import sys

def grab_email(file):
    email_pattern = re.compile(r'\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b',re.IGNORECASE)
    found = set()
    if os.path.isfile(file):
        for line in open(file, 'r'):
            found.update(email_pattern.findall(line))
        for email_address in found:
            print (email_address)
    if __name__ == '__main__':
        grab_email(sys.argv[1])


grab_email('email_addresses.txt')

现在我遇到的问题是,在某个点之后,程序崩溃了。这是输出:

125512@12451.cpm
es@gomail.com
asda@asdasdaad.ca
223@home.ca
moee@gmail.com
moi1990@gmail.com
domain@name.com
Traceback (most recent call last):
  File "D:/Sheridan/Part Time/TELE26529 Linux Architecture w. Network Scripting/Python Assignment 3.5/question1.py", line 17, in <module>
    grab_email('email_addresses.txt')
  File "D:/Sheridan/Part Time/TELE26529 Linux Architecture w. Network Scripting/Python Assignment 3.5/question1.py", line 14, in grab_email
    grab_email(sys.argv[1])
IndexError: list index out of range

我在这里做错了什么,我该如何解决这个问题?如何更有效地处理这些异常?

【问题讨论】:

  • 你在命令行传递什么?
  • @squiguy 我不是。我直接从脚本本身运行它。

标签: python regex list email search


【解决方案1】:

问题出在这部分:

if __name__ == '__main__':
        grab_email(sys.argv[1])

您的程序正在崩溃,因为它正在 grab_email 函数内部处理此问题。由于您从解释器运行,if 语句当然会评估为True。然后,由于您没有传递任何命令行参数,因此您正在尝试一个不存在的列表元素,从而导致您得到错误。

要修复,只需消除!它应该看起来像:

import os
import re
import sys

def grab_email(file):
    email_pattern = re.compile(r'\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b',re.IGNORECASE)
    found = set()
    if os.path.isfile(file):
        for line in open(file, 'r'):
            found.update(email_pattern.findall(line))
        for email_address in found:
            print (email_address)

if __name__ == '__main__':
    grab_email(sys.argv[1])

现在可以从命令行正确运行(假设您从命令行正确传递了文件名)。我还删除了无关的函数调用。

当然,如果您只是想让它在解释器中运行,请取出 if 语句并恢复我删除的函数调用。你也可以这样做:

if __name__ == '__main__':
    if len(sys.argv)>1:
        grab_email(sys.argv[1])
    else:
        grab_email('email_addresses.txt')

这本身并不好,但可以处理该特定错误(同时引入另一个潜在错误)。

【讨论】:

  • 这有助于消除回溯错误,但它仍然没有读取文件的其余部分,我相信您已经知道了。如何让它读取整个文件并显示所有正确的结果?
  • 它正在输出与您的正则表达式匹配的所有内容。或者它在您提供的示例中。您可以在输出中看到文件的最后一行,因此您知道它已被读取。
  • 您还需要修正您对数据结构的选择。一组没有顺序,所以你最终会想要一个列表。我也会对其进行排序,具体取决于您如何阅读该部分说明。
  • 如果我将输出附加到一个首先在开头声明的空列表中,它会起作用吗?
猜你喜欢
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
相关资源
最近更新 更多