[英]For-Loop: How to ignore previously added values in a list? (Python)
我有一個循環,不斷向列表中添加一個未知值的變量,然后打印列表。 但是,當我想要下次打印列表時,我找不到忽略先前找到並添加到列表中的值的方法。
我正在使用循環中的請求和bs4抓取一個不斷更新的網站,用於關鍵字匹配鏈接。 一旦網站添加了鏈接,我正在尋找我的代碼,將它們添加到列表中,然后打印列表。 一旦網站添加了下一波匹配鏈接,這些也將添加到我的列表中,但是我的代碼也會將之前找到的舊鏈接再次添加到列表中,因為它們仍然匹配我的關鍵字。 是否可以忽略這些舊鏈接?
url = "www.website.com"
keyword = "news"
results = [] #list which saves the links
while True:
source = requests.get(url).text
soup = BeautifulSoup(source, 'lxml')
options = soup.find_all("a", class_="name-link")
for o in options:
if keyword in o.text:
link = o.attrs["href"] #the links I want
results.append(link) #adds links to list
print(results)
time.sleep(5) #wait until next scrape
#so with every loop the value of 'link' is changing which makes it hard
for me to find a way to ignore previously found links
為了使它更容易理解,你可以想到一個循環在每次執行循環時向列表中添加一個未知數字,但該數字應該只在第一次執行時打印。
以下是使用集合的概念證明,如果挑戰是您只想保留唯一鏈接,然后打印以前未找到的新鏈接:
import random
results = set()
for k in range(15):
new = {random.randint(1,5)}
print(f"First Seen: {new-results}")
results = results.union(new)
print(f"All: {results}")
如果它更像是一個流媒體問題,你將所有鏈接保存到一個大的列表,但只想打印最新發現的鏈接,你可以這樣做:
import random
results = []
for k in range(5):
n = len(results)
new = []
for k in range(random.randint(1,5)):
new.append(random.randint(1,5))
results.extend(new)
print(results[n:])
但話又說回來,你也可以在這種情況下打印new
....
這是Set
數據結構的一個很好的用例。 集合不保持項目的任何排序。 對上面的代碼進行非常簡單的更改:
url = "www.website.com"
keyword = "news"
results = {}
while True:
source = requests.get(url).text
soup = BeautifulSoup(source, 'lxml')
options = soup.find_all("a", class_="name-link")
for o in options:
if keyword in o.text:
link = o.attrs["href"] #the links I want
results.add(link) #adds links to list
print(results)
time.sleep(5) #wait until next scrape
如果要維護順序,可以使用有序字典的某些變體。 請看這里: Python有一個有序集嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.