如何忽略Python上的IndexError

时间:2014-11-10 21:38:35

标签: python indexing

我正在尝试编写一个脚本,该脚本将遍历网址列表并抓取连接到该网址的网页并将内容保存到文本文件中。不幸的是,一些随机网址会导致页面格式不同,并且会出现一个IndexError。如何编写一个只跳过IndexError并转到下一个URL的脚本?我尝试了下面的代码,但只是出现语法错误。非常感谢您的帮助。

from bs4 import BeautifulSoup, SoupStrainer
import urllib2
import io
import os
import re

urlfile = open("dailynewsurls.txt",'r') # read one line at a time until end of file
for url in urlfile:  
    try:

        page = urllib2.urlopen(url)
        pagecontent = page.read() # get a file-like object at this url

        soup = BeautifulSoup(pagecontent)

        title = soup.find_all('title')
        article = soup.find_all('article')

        title = str(title[0].get_text().encode('utf-8'))
    except IndexError:
        return None 
        article = str(article[0].get_text().encode('utf-8'))
    except IndexError:
        return None

       outfile = open(output_files_pathname + new_filename,'w')
       outfile.write(title)
       outfile.write("\n")
       outfile.write(article)
       outfile.close()

    print "%r added as a text file" % title

print "All done." 

我得到的错误是:       文件“dailynews.py”,第39行          除了IndexError:               ^       SyntaxError:语法无效

4 个答案:

答案 0 :(得分:4)

你会做类似的事情:

try:
    # the code that can cause the error
except IndexError: # catch the error
    pass # pass will basically ignore it
         # and execution will continue on to whatever comes
         # after the try/except block

如果您处于循环中,则可以使用continue代替passcontinue将立即跳转到循环的下一个迭代, 无论是否有更多的代码要在迭代中执行 它跳了起来。 sys.exit(0)将结束该计划。

答案 1 :(得分:2)

当我在Python 2.5或2.7中运行您的实际程序(原始版本或编辑过的版本)时,我得到的语法错误是:

SyntaxError: 'return' outside function

其含义应该非常明显:如果你不在函数中,你可以从函数中returnimport sys # ... except IndexError: sys.exit() 如果你想"返回"从整个程序中,您可以使用exit

执行此操作
exit

(注意你可以给0一个值,但它必须是一个小整数,而不是一个任意的Python值。大多数shell有一些方法可以使用那个返回值,通常期望{{1}表示成功,表示错误的正数。)


在您的更新版本中,如果您解决了这个问题(无论是将整个内容移动到一个函数中然后调用它,还是使用exit而不是return),您将获得{{1 }}。以IndentationError开头的行必须缩进到与上面outfile = …相同的级别(在这种情况下,它们是return None子句的一部分,并且永远不会运行),或缩减回与excepttry行相同的级别(在这种情况下,它们将始终运行,除非您已完成except,{{1} },continuereturn,未处理break等。)

如果您解决了这个问题,那么您向我们展示的代码中不会再出现语法错误。


我怀疑您编辑的代码仍然不是您的真实代码,并且您的实际代码中可能还有其他语法错误。一个常见的难以诊断的错误是在一行的末尾缺少exit(或者,通常为raise)),这通常会导致 next < / em>行报告],通常在某个奇怪的位置,如冒号(并且将会,没有前一行)完全有效。但是,如果没有看到您的真实代码(或者更好,真正的verifiable example),则无法进一步诊断。


话虽这么说,但我认为你根本不想}(或SyntaxError)。您正在尝试继续循环的下一次迭代。您可以使用return语句执行此操作。 exit语句突破循环和整个函数,这意味着其余的URL都不会被处理。


最后,虽然它不是非法的,但在continuereturn等之后有额外的陈述是没有意义的,因为这些陈述永远不会被运行。同样地,虽然有两个return条款具有相同的例外并不违法,但它毫无意义;第二个只能在异常不是continue而是except的情况下运行,这意味着永远不会。

我怀疑您可能希望在两个索引语句中分别使用单独的IndexError / IndexError,而不是围绕整个循环。虽然这里根本不需要,但有时可以让事情更清楚。如果这就是您的目标,那么您希望这样写:

try

答案 2 :(得分:0)

执行以下操作:

 except IndexError:
     pass

根据其他用户的建议,删除除IndexError之外的其他用户。

答案 3 :(得分:0)

你不能&#34;返回&#34;

   except IndexError:
        return None 
        article = str(article[0].get_text().encode('utf-8'))

这不是函数调用

使用&#34;传递&#34;或者&#34;打破&#34;或者&#34;继续&#34;

修改 试试这个

try:
    page = urllib2.urlopen(url)
    pagecontent = page.read() # get a file-like object at this url

    soup = BeautifulSoup(pagecontent)

    title = soup.find_all('title')
    article = soup.find_all('article')

    title = str(title[0].get_text().encode('utf-8'))
except IndexError:
    try:
        article = str(article[0].get_text().encode('utf-8'))
    except IndexError:
        continue