Как я могу отсортировать результаты двух циклов по времени? Это две разные петли, но я хотел бы упорядочить их вместе, смешав первую и вторую петли, чтобы рассортировать все по времени. По сути, этот код очищает время и название некоторых новостей и печатает их в текстовом поле. Это две разные петли.
Я написал этот код, но он не работает
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()
allnews = news1, news2
создает кортеж с двумя списками (используйте pritn(allnews)
, чтобы увидеть, что у вас действительно есть), и он может изменить, какой список будет первым, а какой вторым в этом кортеже. Он не может сортировать все элементы как один список. Вам нужно будет добавить списки news1 + news2
, чтобы создать единый список. И вы должны сделать это, прежде чем вставлять элементы в textbox
.
честно говоря, вы должны получить ошибку, потому что allnews = news1, news2
дает tuple
, а tuple
не имеет sort()
.
Я вижу другую проблему - news1
имеет только последний текст о TEXAS RANGER
, а news2
имеет только последний текст о DETROIT
. Вы должны создать allnews = []
перед циклами, внутри циклов вы должны только добавить в этот список allnews.append(news1)
и т.д. после циклов вы должны отсортировать список, а позже вы должны вставить новости в textarea
Вы делаете это в неправильном порядке. Сначала вам нужно создать пустой список, затем в цикле вы должны добавить новости в этот список (без отображения), после цикла вы должны отсортировать список (с помощью 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' } . Вы не использовали его, и он работает одинаково хорошо. В чем разница между использованием заголовков и их неиспользованием? Спасибо
некоторые серверы используют этот заголовок для создания разных HTML-кодов для разных браузеров на разных устройствах (телефон, ноутбук, рабочий стол). Некоторые серверы используют его для обнаружения ботов/скриптов и их блокировки. Но многие серверы его не проверяют и его можно пропустить. Поэтому обычно я начинаю без этого заголовка или добавляю короткий Mozilla/5.0
, потому что не помню полную версию. И если это не работает с сервером, я копирую полный заголовок из своего браузера.
сначала поместите все в один список, затем отсортируйте этот список и, наконец, отобразите элементы из списка в текстовом поле