![](/img/trans.png)
[英]Python: Creating each item in a list as a variable and assigning a value to it in a for loop
[英]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
与xml[ini:]
,你得到的只是它的结束,这意味着find()
将返回子串的位置在该片 xml
,而不是它的全部。 例如,让xml
是这样的:
<loc> blarg </loc> abcd <loc> text </loc>
现在, find('<loc>')
返回0
。 ini
为0
,因此您捕获了" blarg "
并且find('</loc>')
返回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解析器,因为即使此代码也做出了一些潜在的危险假设。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.