![](/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.