【问题标题】:dealing with empty url breaking xml parsing loop处理空 url 破坏 xml 解析循环
【发布时间】:2014-05-11 20:51:02
【问题描述】:

我正在编写一个代码来解析一堆 xml 文件。基本上是这样的:

for i in range(0, 20855):
    urlb = str(i)
    url = urla + urlb
    trys=0
    t=0
    while (trys < 3):
        try:
            cfile = UR.urlopen(url)
            trys = 3
        except urllib.error.HTTPError as e:
            t=t+1
            print('error at '+str(time.time()-tstart)+' seconds')
            print('typeID = '+str(i))
            print(e.code)
            print(e.read())
            time.sleep (0.1)
            trys=0+t
    tree = ET.parse(cfile)   ##parse xml file
    root = tree.getroot()
    ...do a bunch of stuff with i and the file data

我调用的某些 url 实际上不包含破坏我的代码的 xml 文件时遇到问题。我有一个我使用的所有实际数字的列表,而不是显示的范围,但我真的不想遍历所有 21000 并删除每个失败的数字。有没有更简单的方法来解决这个问题?我从 while 循环中得到一个错误(我必须真正处理超时),如下所示:

b'A non-marketable type was given'
error at 4.321678161621094 seconds
typeID = 31
400

所以我在想,如果我的 while 循环返回三个错误但我不能使用 break,则必须有一种好方法来摆脱 for 循环的迭代。如果 t 变量为 3,可能会在 while 循环下的 if/else 循环通过?

【问题讨论】:

  • if 循环“有效”,但速度慢得令人讨厌。有没有办法让错误循环根据特定错误采取行动?我能说如果错误代码是 400(我相信这就是它告诉我的内容)然后跳过那个数字吗?
  • 除了以下建议之外,您可能还想尝试使用BeautifulSoup 进行解析。它可以从更多的无效 HTML 案例中恢复,但速度稍慢。如果您知道您的文档是 100% 有效的 XML,您还可以查看 lxml,它更快,并且总体上可以很好地处理 XML。

标签: python xml parsing url python-3.x


【解决方案1】:

你可以试试这个:

for i in range(0, 20855):
    url = '%s%d' % (urla, i)
    for trys in range(3):
        try:
            cfile = UR.urlopen(url)
            break
        except urllib.error.HTTPError as e:
            print('error at %s seconds' % (time.time()-tstart))
            print('typeID = %i'%i)
            print(e.code)
            print(e.read())
            time.sleep(0.1)
    else:
        print "retry failed 3 times"
        continue
    try:
        tree = ET.parse(cfile)   ##parse xml file
    except Exception, e:
        print "cannot read xml"
        print e
        continue
    root = tree.getroot()
    ...do a bunch of stuff with i and the file data

【讨论】:

  • 不要过于笼统的except Exception, e,应该查找可能发生的异常,然后专门捕获它们。
  • 这看起来很有希望。我在 Exception 之后的逗号有语法错误。你知道 3.3 的正确语法吗?快速查看 3.3 异常文档我无法判断
  • 找到了。 3.3 的正确语法是 except Exception as e:
【解决方案2】:

关于您的“算法”问题:您始终可以在 while 正文中设置错误状态(例如 last_iteration_successful = False),然后跳出 while 正文,然后检查 for 正文中的错误状态,然后也有条件地突破 for 身体。

关于架构:通过使用 try/except 块进行适当的异常处理,为可能发生的所有相关错误准备代码。定义自定义异常类型,然后手动引发它们也可能有意义。引发异常会立即中断当前的控制流,可以节省很多breaks。

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多