[英]Python loop skipping one element while looping
我有這段代碼遍歷了Top Alexa 1000
網站,並獲得了允許以任何形式Sign Up
或Login
。 如果此循環的一個迭代中有一個網站被卡住或以任何形式引發Exception
,則將其從列表中刪除,然后使用下一個元素重新開始循環。 我正在Python
使用selenium
包來執行此操作。 它工作正常,除了由於某種原因,它遍歷我的alexa_1000
包含列表的變量中的每個其他元素(即跳過一個元素),而不是遍歷每個元素。 誰能幫忙嗎? 我所看到的代碼似乎沒有什么問題,並且我一直在調試它以查看程序流程,但實際上無法弄清楚發生了什么。 該程序的總體流程似乎很好。 當我打印每個循環的索引時,要了解跳過的本質,從0到1到2到3的意義上似乎還不錯。希望得到任何幫助。 這是代碼:
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
def get_alexa_top_pages():
sites = []
with open('topsites_1000.txt', 'r') as f:
for line in f:
line = line.strip('\n')
sites.append(line)
sites = filter(None, sites)
sites = ['http://www.' + site for site in sites]
return sites
def main():
alexa_1000 = get_alexa_top_pages()
out = open('sites_with_login.txt', 'w')
sign_in_strings = ['sign in', 'signin', 'login', 'log in', 'sign up', 'signup']
driver = webdriver.Firefox()
driver.set_page_load_timeout(30)
for index, page in enumerate(alexa_1000):
try:
print "Loading page %s (num %d)" %(page, index + 1)
driver.get(page)
html_source = driver.page_source
html_source = html_source.lower()
present = any([i in html_source for i in sign_in_strings])
if present:
out.write(page + '\n')
alexa_1000.remove(page)
except TimeoutException as ex:
alexa_1000.remove(page)
continue
except Exception as ex:
alexa_1000.remove(page)
continue
out.close()
if __name__ == "__main__":
main()
有多種方法可以解決此問題。 問題是因為您在枚舉時接觸到枚舉。 應該始終避免這種情況。 您可以通過重寫代碼來做到這一點
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
def get_alexa_top_pages():
sites = []
with open('topsites_1000.txt', 'r') as f:
for line in f:
line = line.strip('\n')
sites.append(line)
sites = filter(None, sites)
sites = ['http://www.' + site for site in sites]
return sites
def main():
alexa_1000 = set(get_alexa_top_pages())
alexa_invalid = set()
out = open('sites_with_login.txt', 'w')
sign_in_strings = ['sign in', 'signin', 'login', 'log in', 'sign up', 'signup']
driver = webdriver.Firefox()
driver.set_page_load_timeout(30)
for index, page in enumerate(alexa_1000):
try:
print "Loading page %s (num %d)" %(page, index + 1)
driver.get(page)
html_source = driver.page_source
html_source = html_source.lower()
present = any([i in html_source for i in sign_in_strings])
if present:
out.write(page + '\n')
except TimeoutException as ex:
alexa_invalid.add(page)
continue
except Exception as ex:
alexa_invalid.add(page)
continue
alexa_valid = alexa_1000 - alexa_invalid
out.close()
if __name__ == "__main__":
main()
在此您使用set,一個用於循環,一個用於維護無效列表。 如果發生異常,則更新無效的。 最后,您可以減去兩個來找到有效的站點
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
def get_alexa_top_pages():
sites = []
with open('topsites_1000.txt', 'r') as f:
for line in f:
line = line.strip('\n')
sites.append(line)
sites = filter(None, sites)
sites = ['http://www.' + site for site in sites]
return sites
def main():
alexa_1000 = get_alexa_top_pages()
out = open('sites_with_login.txt', 'w')
sign_in_strings = ['sign in', 'signin', 'login', 'log in', 'sign up', 'signup']
driver = webdriver.Firefox()
driver.set_page_load_timeout(30)
for index, page in enumerate(alexa_1000[::-1]):
try:
print "Loading page %s (num %d)" %(page, index + 1)
driver.get(page)
html_source = driver.page_source
html_source = html_source.lower()
present = any([i in html_source for i in sign_in_strings])
if present:
out.write(page + '\n')
except TimeoutException as ex:
alexa_1000.pop()
continue
except Exception as ex:
alexa_1000.pop()
continue
out.close()
if __name__ == "__main__":
main()
在這種情況下,您以相反的順序循環,而錯誤的循環,則將它們彈出。 最后alexa_1000
將擁有您處理的所有有效網站
有很多方法可以解決此問題,上面僅顯示了您可以理想使用的兩種方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.