簡體   English   中英

在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

當你切xmlxml[ini:] ,你得到的只是它的結束,這意味着find()將返回子串的位置在該片 xml ,而不是它的全部。 例如,讓xml是這樣的:

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

現在, find('<loc>')返回0 ini0 ,因此您捕獲了" blarg "並且find('</loc>')返回12 ini設置為12 在循環的下一次迭代中, find('<loc>')找到第二個"<loc>" 您現在捕獲" text " 這就是問題所在。 您可以在inixml進行切片,以獲得"</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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM