虽然循环被忽略了

时间:2017-07-03 14:14:43

标签: python python-2.7 while-loop

Hej Everyone,

该脚本的想法是从我公司网站的目录页面抓取图像链接,并将它们更改为具有更高分辨率的图像链接并过滤图像格式,其中要过滤的变量可在链接本身中找到,在这种情况下是首都P.然后用链接生成一个csv。

对csv的转换,过滤和写入工作正常,但我的问题是我不想要所有80个产品,我只想要8在列表nl中。

links列表包含此类https://rndr.mywebsite.com/media/catalog/product/seo-cache/x386/19/95/19-95-101P/How-Hard-You-Hit-Butcher-Billy-Premium-Poster.jpg

之类的元素

注意:变量比率和广告素材(inputnumber-1)由命令行输入定义。只需假设输入为ratio = Pcreatives = 9-1

NOTE2 :为了加快测试速度,目前链接列表的限制为15个元素。

nl= []
string1= "https://rndr.mywebsite.com/media/catalog/product/cache/x800/"
string2= ".jpg"

while len(nl) <= creatives:                        
    for index in range(len(links)):
        if "P" in "".join(links[index].split("/", 12)[10]) and "P" in ratio:
            print("YEAH", len(nl))
            nl.extend([string1 + "/".join(links[index].split("/", 11)[8:11]) + string2])
        else:
            print ("Ups", len(nl))
print (nl)

实际输出是

('YEAH', 0)
('YEAH', 1)
('YEAH', 2)
('YEAH', 3)
('Ups', 4)
('YEAH', 4)
('YEAH', 5)
('Ups', 6)
('YEAH', 6)
('YEAH', 7)
('YEAH', 8)
('YEAH', 9)
('YEAH', 10)
('YEAH', 11)
('YEAH', 12)
[https://rndr.mywebsite.com/media/catalog/product/cache/x800/19/95/19-95-101P.jpg, transformed-link2,...,transformed-link12]

正如您所看到的,过滤和转换工作正常,但在列表nl中有9个链接后应该停止。

3 个答案:

答案 0 :(得分:2)

正如Coldspeed所提到的,在内循环中,您将整批项目添加到nl,从而超出限制。要修复它,你可以摆脱while循环并改为:

for index in range(len(links)):
    if "P" in "".join(links[index].split("/", 12)[10]) and "P" in ratio:
        print("YEAH", len(nl))
        nl.append(string1 + "/".join(links[index].split("/", 11)[8:11]) + string2)
        if len(nl) > creatives: 
            break
    else:
        print ("Ups", len(nl))

答案 1 :(得分:1)

添加这样的一些打印语句可以帮助您确切了解发生了什么:

while len(nl) <= creatives:     
    print('outer loop')                   
    for index in range(len(links)):
        print('inner loop')
        ...

你在这里有一个嵌套循环。发生的事情是,在内部循环内部,不检查外部循环的条件,直到内部循环完成迭代。您需要做的是在内部循环中放置一个明确的break

查看this answer的解决方案。 :)

答案 2 :(得分:1)

你在while循环中做了一个for循环。 while循环只会在完成第一个for循环时检查其条件,此时你已经遍历links中的每个元素。

E.g。

i = 0
while i < 10:
    for z in range(20):
        i = z
        print(i)

将一直打印到19,因为只有在内部for循环结束时才会检查while循环的前提条件。