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

当您用 xml[ini:] 分割 xml 时,您只是得到它的结尾,这意味着 find() 正在返回子字符串在 [=52= 中的位置]slice of xml,不是全部。例如,设 xml 为:

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

现在,find('<loc>') returns 0ini0,因此您捕获 " blarg "find('</loc>') returns 12ini 设置为 12。在循环的下一次迭代中,find('<loc>') 找到第二个 "<loc>"。您现在捕获 " text "。这就是它出错的地方。在 ini 处切片 xml 得到 "</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 解析器,因为即使是这段代码也会做出一些潜在危险的假设。