繁体   English   中英

在while循环中变量未在python中分配值

[英]Variable not assigning value in python in 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

当你切xmlxml[ini:] ,你得到的只是它的结束,这意味着find()将返回子串的位置在该片 xml ,而不是它的全部。 例如,让xml是这样的:

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

现在, find('<loc>')返回0 ini0 ,因此您捕获了" blarg "并且find('</loc>')返回12 ini设置为12 在循环的下一次迭代中, find('<loc>')找到第二个"<loc>" 您现在捕获" text " 这就是问题所在。 您可以在inixml进行切片,以获得"</loc> abcd <loc> text </loc>" 您在该片上调用find('<loc>') ,它在xml找到第二个"<loc>" ,这是该子串在片中的首次出现。 问题在于切片中该事件的索引是12 ,而不是24 ,这就是您想要的。 您缺少字符串中的前ini字符。

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

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

当然,可以缩短为:

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

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

但是,如注释中所述,您应该真正使用XML解析器。

@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解析器,因为即使此代码也做出了一些潜在的危险假设。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM