对于第一次之后未遍历的循环-Python

对于第一次之后未遍历的循环-Python,python,regex,for-loop,Python,Regex,For Loop,我试图忽略搜索中被列入黑名单的URL。”ltp_block'包含包含不同URL的数据 p = re.compile('href="(.*?)" rel="nofollow"') url = "http://www.****.**" + p.findall(current)[0] r = requests.get(url) 上述代码用于从“ltp_块”获取不同的URL。r、 url定义调用时循环中的url for each_row in blacklist: if(re.findall

我试图忽略搜索中被列入黑名单的URL。”ltp_block'包含包含不同URL的数据

p = re.compile('href="(.*?)" rel="nofollow"')
url = "http://www.****.**" + p.findall(current)[0]

r = requests.get(url)
上述代码用于从“ltp_块”获取不同的URL。r、 url定义调用时循环中的url

for each_row in blacklist:
    if(re.findall('\\b'+each_row[0]+'\\b', r.url, flags=re.IGNORECASE) != []):
        print "found"
问题-上述“for”循环只工作一次。当“check”变为1或主循环选择另一个url时,第二个“for”循环将被跳过,就像它不存在一样。为什么?

conn = sqlite3.connect('test.db')
c = conn.cursor()
blacklist = c.execute("SELECT `name` FROM `blacklist`")
check = 0
for row in ltp_block:

        p = re.compile('versan')
        current = ltp_block[check]
        if(p.findall(current) != []):
            p = re.compile('price=(.*?)&')
            ltp = p.findall(current)[0]
            del p
        else:
            p = re.compile('Gesa: (.*?) &')
            ltp = p.findall(current)[0]
            del p

        p = re.compile('href="(.*?)" rel="nofollow"')
        url = "http://www.****.**" + p.findall(current)[0]

        r = requests.get(url)

        for each_row in blacklist:
            if(re.findall('\\b'+each_row[0]+'\\b', r.url, flags=re.IGNORECASE) != []):
                print "found"

        check = check + 1
答复——

每次我都必须重新编译blacklist=c.execute(“选择
黑名单中的
名称
”)


我把它放在主“for”循环中,现在一切都正常了。

for循环被“简单地跳过,就像它不存在一样”的唯一方法是如果没有任何东西可以迭代。如果确实如此,唯一的解释是
黑名单
为空。如果你的报告是真实的,那就没有其他解释了

这样的事情很容易证明。在循环之前添加一条print语句,并打印出
黑名单的值:

print "blacklist:", blacklist
for each_row in blacklist:
    ...

for循环“像不存在一样简单地被跳过”的唯一方法是,如果没有可迭代的内容。如果确实如此,唯一的解释是
黑名单
为空。如果你的报告是真实的,那就没有其他解释了

这样的事情很容易证明。在循环之前添加一条print语句,并打印出
黑名单的值:

print "blacklist:", blacklist
for each_row in blacklist:
    ...

c.execute
返回迭代器。迭代器只能迭代一次。作为一个简单的示例,请尝试以下操作:

numbers = (x for x in xrange(10))  # a simple iterator

for number in numbers:
     print number

print "Repeat"

for number in numbers:
     print number
只有第一个循环给出任何输出,因为迭代器在第二个循环开始时已耗尽且为空。与之相比:

numbers = (x for x in xrange(10))
numbers = list(numbers)  # turn the iterator into a list

for number in numbers:
     print number

print "Repeat"

for number in numbers:
     print number
这和预期的一样。在您的情况下,您需要:

blacklist = list(c.execute("SELECT `name` FROM `blacklist`"))

c.execute
返回迭代器。迭代器只能迭代一次。作为一个简单的示例,请尝试以下操作:

numbers = (x for x in xrange(10))  # a simple iterator

for number in numbers:
     print number

print "Repeat"

for number in numbers:
     print number
只有第一个循环给出任何输出,因为迭代器在第二个循环开始时已耗尽且为空。与之相比:

numbers = (x for x in xrange(10))
numbers = list(numbers)  # turn the iterator into a list

for number in numbers:
     print number

print "Repeat"

for number in numbers:
     print number
这和预期的一样。在您的情况下,您需要:

blacklist = list(c.execute("SELECT `name` FROM `blacklist`"))


你说的“行为不端”到底是什么意思?它根本不运行吗?它会抛出错误吗?您是否尝试过最简单的调试技术:打印中间值以查看它们是否符合您的预期?它会被跳过,就像它不存在一样。EditedNote在Python中循环计数是不好的样式,请改用
enumerate()
。您不会显示
blacklist
的来源,但我猜它是一个打开的文件。一旦你读了一个完整的文件,这个文件就会被定位在EOF,读更多的东西永远不会得到更多。还有,为什么要使用
delp
?为什么每次都这样编译正则表达式呢?它来自数据库。德尔普,因为我在尝试各种各样的事情。我这样编译我的正则表达式是因为这是我第一次使用Python,我从中学到的教程向我展示了如何用这种方式编译它。你所说的“错误行为”到底是什么意思?它根本不运行吗?它会抛出错误吗?您是否尝试过最简单的调试技术:打印中间值以查看它们是否符合您的预期?它会被跳过,就像它不存在一样。EditedNote在Python中循环计数是不好的样式,请改用
enumerate()
。您不会显示
blacklist
的来源,但我猜它是一个打开的文件。一旦你读了一个完整的文件,这个文件就会被定位在EOF,读更多的东西永远不会得到更多。还有,为什么要使用
delp
?为什么每次都这样编译正则表达式呢?它来自数据库。德尔普,因为我在尝试各种各样的事情。我这样编译我的正则表达式是因为这是我第一次使用Python,我从中学到的教程告诉我如何用这种方式编译它。我也调试了它。如果
黑名单
不是空的,那么你关于循环没有运行的断言就是假的。循环正在运行,但循环中的代码没有达到预期效果。如果
blacklist
是可编辑且非空的,则循环将运行。是的,您是对的。我找到了答案,我将blacklist=c.execute(“SELECT
name
FROM
blacklist
”)放在主循环及其工作区。然而,这让我感到好奇,我没有把黑名单分配给其他任何东西,那么为什么我必须把它放在主“for”循环中work@Nuv:因为内部for循环消耗整个迭代器。一旦到达结果的末尾,它就不会从一开始就再次迭代。在循环内重复运行查询会对性能造成不良影响。如果可以,将结果缓存在外循环之前的列表中:
blacklist=list(c.execute(“SELECT
name`FROM
blacklist
”)`.@StevenRumbalski:Perfect。我使用了你的方法,它仍然有效,不会影响性能。不,黑名单从来都不是空的。我也调试了它。如果
黑名单
不是空的,那么你关于循环没有运行的断言就是假的。循环正在运行,但循环中的代码没有达到预期效果。如果
blacklist
是可编辑且非空的,则循环将运行。是的,您是对的。我找到了答案,我将blacklist=c.execute(“SELECT
name
FROM
blacklist
”)放在主循环及其工作区。然而,这让我感到好奇,我没有把黑名单分配给其他任何东西,那么为什么我必须把它放在主“for”循环中work@Nuv:因为内部for循环消耗整个迭代器。一旦到达结果的末尾,它就不会从一开始就再次迭代。在循环内重复运行查询会对性能造成不良影响。如果可以,将结果缓存在外循环之前的列表中:
blacklist=list(c.execute(“SELECT
name`FROM
blacklist
”)`.@StevenRumbalski:Perfect。我使用了你的方法,它仍然有效,不会影响性能。