以下代码似乎不起作用。我希望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
答案 0 :(得分:1)
使用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 "
。这是它出错的地方。您在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)
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解析器,因为即使这个代码也会产生一些潜在的危险假设。