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 0
。 ini
是 0
,因此您捕获 " blarg "
和 find('</loc>')
returns 12
。 ini
设置为 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 解析器,因为即使是这段代码也会做出一些潜在危险的假设。
以下代码似乎不起作用。我希望 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 0
。 ini
是 0
,因此您捕获 " blarg "
和 find('</loc>')
returns 12
。 ini
设置为 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 解析器,因为即使是这段代码也会做出一些潜在危险的假设。