For-Loop: Как игнорировать ранее добавленные значения в списке?(Python) - PullRequest
0 голосов
/ 25 марта 2019

У меня есть цикл, который постоянно добавляет переменную с неизвестным значением в список, а затем печатает список.Однако я не нахожу способ игнорировать ранее найденные значения и добавленные в список, когда я хочу напечатать список в следующий раз.

Я очищаю постоянно обновляемый веб-сайт для ссылок соответствия ключевых слов, используязапросы и 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

Чтобы облегчить понимание, вы могли бы подумать о цикле, добавляющем неизвестное число в список при каждом выполнении цикла, но номер должен толькопечататься в первом исполнении.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Это хороший вариант использования для 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 упорядоченный набор?

0 голосов
/ 25 марта 2019

Вот подтверждение концепции с использованием наборов, если проблема заключается в том, что вы хотите сохранить только уникальные ссылки, а затем распечатать новые найденные ссылки, которые не были найдены ранее:

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 в этом случае ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...