变量不在while循环中的python中赋值

时间:2015-03-18 21:55:53

标签: python xml python-2.7 while-loop

以下代码似乎不起作用。我希望ini变量递增,逻辑上代码似乎这样做。但是,这不起作用。

def refinexml(xml):
links = []
ini = 0
while xml[ini:].find('<loc>') != -1:
    links.append(xml[xml[ini:].find('<loc>') + 5:xml[ini:].find('</loc>')])
    ini = xml[ini:].find('</loc>')
    print ini
return links

2 个答案:

答案 0 :(得分:1)

使用xmlxml[ini:]进行切片时,您只是结束了它,这意味着find()正在返回该切片中子字符串的位置xml,而不是全部。例如,让xml成为:

<loc> blarg </loc> abcd <loc> text </loc>

现在,find('<loc>')返回0ini0,因此您抓取" blarg "find('</loc>')返回12ini设置为12。在循环的下一次迭代中,find('<loc>')找到第二个"<loc>"。您现在捕获" text "。这是它出错的地方。您在xml处对ini进行切片以获得"</loc> abcd <loc> text </loc>"。您在该切片上调用find('<loc>'),该切片在"<loc>"中找到第二个xml,这是切片中第一个出现的子串。问题是切片中该事件的索引是12,而不是24,这正是您想要的。您错过了字符串中的第一个ini字符。

幸运的是,你知道你有多少个角色。您需要添加ini,您可以这样做:

ini = ini + xml[ini:].find('</loc>')

当然,这可以缩短到这一点:

ini += xml[ini:].find('</loc>')

您可以通过添加单个字符来解决问题。

正如评论中所提到的,你应该真正使用XML解析器。

答案 1 :(得分:1)

@KSFT很好地解释了这一点。我只是指出您可以使用以下内容消除代码中find()的大量冗余调用:

def refinexml(xml):
    links = []

    start = xml.find('<loc>')
    while start != -1:
        start += 5
        end = xml.find('</loc>', start)
        links.append(xml[start:end].strip())
        start = xml.find('<loc>', end + 6)
    return links

但是,实际上,您应该只使用XML解析器,因为即使这个代码也会产生一些潜在的危险假设。