2015-03-18 65 views
0

下面的代码似乎不起作用。我想让ini变量增加,而逻辑上代码似乎是这样做的。但是,这不起作用。在while循环中python中没有赋值的变量

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

您似乎将xml文档解析为字符串...是否有任何特殊原因不使用xml解析器,例如[ElementTree](https://docs.python.org/2/library/xml .etree.elementtree.html#模块xml.etree.ElementTree)? – ig0774 2015-03-18 22:07:30

回答

1

当你切xmlxml[ini:],你得到的只是它的结束,这意味着find()正在恢复在xml,不是所有的子串的位置。例如,让xml是这样的:

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

现在,find('<loc>')回报0ini0,因此您截取" blarg "find('</loc>')返回12ini设置为12。在循环的下一次迭代中,find('<loc>')找到第二个"<loc>"。您现在捕获了" text "。这是它出错的地方。您在ini处切片xml以获得"</loc> abcd <loc> text </loc>"。您在该片上调用find('<loc>'),该片找到片中的第二个"<loc>",这是该片中该子串的第一次出现。问题是该片中发生的索引是12,而不是24,这正是您想要的。您错过了字符串中的第一个ini个字符。

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

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

那当然,可以缩短到这一点:

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

您可以通过添加一个字符解决您的问题。

正如评论中提到的那样,你应该真的使用XML解析器。

1

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