0

我是 Python 新手,在 StackOverflow 的帮助下,我编写了一个程序:

1) 在给定目录中查找,并针对该目录中的每个文件:

2) 运行一个 HTML 清理程序,它:

  • 用 BeautifulSoup 打开每个文件
  • 删除列入黑名单的标签和内容
  • 美化剩余内容
  • 运行 Bleach 以删除所有未列入白名单的标签和属性
  • 另存为新文件

它工作得很好,除了当它遇到某种文件内容时抛出一堆 BeautifulSoup 错误并中止整个事情。我希望它对此具有强大的抵抗力,因为我无法控制此目录中的内容类型。

所以,我的问题是:我如何重新构建程序,以便当它在目录中的一个文件上出错时,它报告它无法处理该文件,然后继续运行剩余的文件?

到目前为止,这是我的代码(删除了无关的细节):

def clean_dir(directory):
    os.chdir(directory)

    for filename in os.listdir(directory):
    clean_file(filename)

def clean_file(filename):

    tag_black_list = ['iframe', 'script']
    tag_white_list = ['p', 'div']
    attr_white_list = {'*': ['title']}

    with open(filename, 'r') as fhandle: 

        text = BeautifulSoup(fhandle)
        text.encode("utf-8")
        print "Opened "+ filename

        # Step one, with BeautifulSoup: Remove tags in tag_black_list, destroy contents.
        [s.decompose() for s in text(tag_black_list)]
        pretty = (text.prettify())
        print "Prettified"

        # Step two, with Bleach: Remove tags and attributes not in whitelists, leave tag contents.
        cleaned = bleach.clean(pretty, strip="TRUE", attributes=attr_white_list, tags=tag_white_list)

        fout = open("../posts-cleaned/"+filename, "w")
        fout.write(cleaned.encode("utf-8"))
        fout.close()

    print "Saved " + filename +" in /posts-cleaned"

print "Done"

clean_dir("../posts/")  

我正在寻找有关如何编写它的任何指导,以便它在 clean_file 函数中遇到解析/编码/内容/属性/等错误后继续运行。

4

2 回答 2

3

您可以使用以下方法处理错误try-except-finally

于 2012-10-23T13:19:10.997 回答
1

您可以在内部clean_file或 for 循环中进行错误处理。

for filename in os.listdir(directory):
    try:
        clean_file(filename)
    except:
        print "Error processing file %s" % filename

如果您知道引发了什么异常,则可以使用更具体的 catch。

于 2012-10-23T13:55:37.040 回答