我正在尝试忽略从我的搜索中列入黑名单的网址。 'ltp_block'包含包含不同网址的数据。
p = re.compile('href="(.*?)" rel="nofollow"')
url = "http://www.****.**" + p.findall(current)[0]
r = requests.get(url)
上面的代码用于从'ltp_block'中获取不同的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'循环仅适用于ONCE。当'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(“SELECT name
FROM blacklist
”)
我把它放在主'for'循环中,现在一切正常
答案 0 :(得分:3)
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`"))
答案 1 :(得分:1)
for循环“只是跳过就像不存在一样”的唯一方法就是没有任何东西可以迭代。如果确实如此,唯一的解释是blacklist
为空。如果您报告的内容是真的,则没有其他解释。
这样的事情很容易证明。在循环之前立即添加打印语句,并打印出blacklist
:
print "blacklist:", blacklist
for each_row in blacklist:
...