Распечатать результаты цикла в последнем порядке времени

Как я могу отсортировать результаты двух циклов по времени? Это две разные петли, но я хотел бы упорядочить их вместе, смешав первую и вторую петли, чтобы рассортировать все по времени. По сути, этот код очищает время и название некоторых новостей и печатает их в текстовом поле. Это две разные петли.

Я написал этот код, но он не работает

from datetime import datetime
allnews = news1, news2
allnews.sort()

У меня нет ошибок, но я получаю, например, такой вывод:

14.24 TEXAS RANGER #this is loop n.1
14.01 TEXAS RANGER #this is loop n.1
14.20 DETROIT #this is loop n.2
14.13 DETROIT #this is loop n.2

I want to get:
14.24 TEXAS RANGER 
14.20 DETROIT
14.13 DETROIT
14.01 TEXAS RANGER

Вот часть моего кода, полезная для решения вопроса. Я не склеиваю весь код, а склеиваю только тот кусок, благодаря которому печатаю

#textbox
textbox = tk.Listbox(window, width=80, height=20, font=('helvetic', 12), selectbackground = "#960000", selectforeground = "white", bg = "white")
textbox.place(x=1, y=1)

def titoli():

   #code of scraping....

    #TEXAS RANGER
    site_texasrangers = requests.get('....')
    soup = BeautifulSoup(site_texasrangers.content, 'html.parser')
    news = soup.find_all('div', attrs = {"class": "tcc-list-news"})

    for each in news:
        for div in each.find_all("div"):
            time= (div.find('span', attrs = {'class': 'hh serif'}).text)
            tile=(" ".join([span.text for span in div.select("a > span")]))

            news1 = (f" {time} {'TEXAS RANGER'}, {title}")            
            textbox.insert(tk.END, news1)


    #DETROIT TIGERS
    site_detroit = requests.get('.....')
    soup = BeautifulSoup(site_detroit.content, 'html.parser')
    news = soup.find_all('div', attrs = {"class": "tcc-list-news"})

    for each in news:
        for div in each.find_all("div"):
            time= (div.find('span', attrs = {'class': 'hh serif'}).text)
            title=(" ".join([span.text for span in div.select("a > span")]))

            news2 = (f" {time} {'DETROIT'}, {title}")       
            textbox.insert(tk.END, news2)


    #sorted
    from datetime import datetime

    allnews = news1, news2
    allnews.sort()


titoli()
window.mainloop()

сначала поместите все в один список, затем отсортируйте этот список и, наконец, отобразите элементы из списка в текстовом поле

furas 21.03.2022 22:39
allnews = news1, news2 создает кортеж с двумя списками (используйте pritn(allnews), чтобы увидеть, что у вас действительно есть), и он может изменить, какой список будет первым, а какой вторым в этом кортеже. Он не может сортировать все элементы как один список. Вам нужно будет добавить списки news1 + news2, чтобы создать единый список. И вы должны сделать это, прежде чем вставлять элементы в textbox.
furas 21.03.2022 22:42

честно говоря, вы должны получить ошибку, потому что allnews = news1, news2 дает tuple, а tuple не имеет sort().

furas 21.03.2022 22:47

Я вижу другую проблему - news1 имеет только последний текст о TEXAS RANGER, а news2 имеет только последний текст о DETROIT. Вы должны создать allnews = [] перед циклами, внутри циклов вы должны только добавить в этот список allnews.append(news1) и т.д. после циклов вы должны отсортировать список, а позже вы должны вставить новости в textarea

furas 21.03.2022 22:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы делаете это в неправильном порядке. Сначала вам нужно создать пустой список, затем в цикле вы должны добавить новости в этот список (без отображения), после цикла вы должны отсортировать список (с помощью reverse=True), а затем использовать цикл для добавления значений в textbox

Что-то вроде этого

def titoli():

    # --- before loops ---
    
    allnews = []

    # --- loops ---
    
    #TEXAS RANGER
    site_texasrangers = requests.get('....')
    soup = BeautifulSoup(site_texasrangers.content, 'html.parser')
    news = soup.find_all('div', attrs = {"class": "tcc-list-news"})

    for each in news:
        for div in each.find_all("div"):
            time  = div.find('span', attrs = {'class': 'hh serif'}).text
            title = " ".join([span.text for span in div.select("a > span")])

            news = f" {time} {'TEXAS RANGER'}, {title})"            

            allnews.append(news)  # <-- append to list without displaying

    #DETROIT TIGERS
    site_detroit = requests.get('.....')
    soup = BeautifulSoup(site_detroit.content, 'html.parser')
    news = soup.find_all('div', attrs = {"class": "tcc-list-news"})

    for each in news:
        for div in each.find_all("div"):
            time  = div.find('span', attrs = {'class': 'hh serif'}).text
            title = " ".join([span.text for span in div.select("a > span")])

            news = f" {time} {'DETROIT'}, {title})"            

            allnews.append(news)  # <-- append to list without displaying

    # --- after loops --- 

    allnews.sort(reverse=True)

    for news in allnews:
        textbox.insert(tk.END, news)

Огромное спасибо. Все в порядке. Любопытство: в своем коде очистки я использовал заголовки = { 'User-Agent': 'Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit / 537.36 (KHTML, например, Gecko) Chrome / 39.0.2171.95 Safari / 537.36' } . Вы не использовали его, и он работает одинаково хорошо. В чем разница между использованием заголовков и их неиспользованием? Спасибо

Jas_99 23.03.2022 14:45

некоторые серверы используют этот заголовок для создания разных HTML-кодов для разных браузеров на разных устройствах (телефон, ноутбук, рабочий стол). Некоторые серверы используют его для обнаружения ботов/скриптов и их блокировки. Но многие серверы его не проверяют и его можно пропустить. Поэтому обычно я начинаю без этого заголовка или добавляю короткий Mozilla/5.0, потому что не помню полную версию. И если это не работает с сервером, я копирую полный заголовок из своего браузера.

furas 23.03.2022 14:56

Другие вопросы по теме