【发布时间】: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