#python #join #web-scraping #formatting
#python #Присоединиться #очистка веб-страниц #форматирование
Вопрос:
Мне нужно соединить две строки.
Первая строка = даты:
(MegaMillions2019 = (date.strftime("%m%d%Y")))
Вторая строка = результаты:
(results = 'n'.join([', '.join(parsed[i]) for i in range(len(parsed))])
(results.replace(' ','')))
Эти строки должны находиться в одной строке, показанной ниже.
Код:
import requests
from bs4 import BeautifulSoup
from datetime import datetime
response = requests.get('https://www.lotterycorner.com/mi/mega-millions/2019')
soup = BeautifulSoup(response.text, 'html.parser')
date = soup.find_all("td", {"class":"win-nbr-date col-sm-3 col-xs-4"})
for date in date:
date2 = (date.get_text())
date = (datetime.strptime(date2, '%b %d, %Y'))
MegaMillions2019 = (date.strftime("%m%d%Y"))
print(MegaMillions2019)
data = []
for ultag in soup.find_all("ul",{"class":"nbr-grp"}):
for litag in ultag.find_all('li'):
results = (litag.get_text().replace(' ','').replace('MegaBall',''))
data.append(results)
parsed = []
for i in range(int(len(data)/7)):
j = i*7
parsed.append(data[j:j 6])
results = 'n'.join([', '.join(parsed[i]) for i in range(len(parsed))])
print(results.replace(' ',''))
Даты вывода:
01222019
01182019
01152019
01112019
01082019
01042019
01012019
Результаты:
8,16,30,38,61,10
4,15,37,59,64,16
2,43,48,62,64,24
29,52,58,60,62,7
4,5,31,62,69,20
13,26,29,38,64,5
21,29,35,54,60,15
Я бы хотел, чтобы они были соединены следующим образом:
01222019,8,16,30,38,61,10
01182019,4,15,37,59,64,16
01152019,2,43,48,62,64,24
01112019,29,52,58,60,62,7
01082019,4,5,31,62,69,20
01042019,13,26,29,38,64,5
01012019,21,29,35,54,60,15
Комментарии:
1. Какой результат вы получаете в данный момент?
2. Добавить их обе вместе в список? или сжать их?
3. вы можете использовать zip
4. вывод, который я в настоящее время получаю, — это даты, напечатанные поверх результатов.
Ответ №1:
dates = []
for date in date:
...
dates.append(str(MegaMillions2019))
...
parsed = []
joined = []
for i in range(int(len(data)/7)):
j = i*7
parsed.append(data[j:j 6])
parsedline = [', '.join(parsed[j]) for j in range(len(parsed))][i]
joined.append(dates[i] ', ' parsedline)
results = 'n'.join(joined)
print(results.replace(' ',''))
Демо:https://repl.it/@glhr/55449729
Пример вывода:
03292019,5,14,15,62,66,3
03262019,4,14,22,43,58,9
Комментарии:
1. Выведите печать (MegaMillions2019) в строке 14.
2. Удалить это из демо, которое вы имеете в виду? Выполнено.
3. когда вы запускаете программу, вы получаете дату, расположенную поверх строки даты / результата. Спасибо всем за помощь.
4. Попробуйте запустить его снова.
Ответ №2:
Вы можете сделать следующее
MegaMillions2019 =[]
for date in date:
date2 = (date.get_text())
date = (datetime.strptime(date2, '%b %d, %Y'))
MegaMillions2019.append(date.strftime("%m%d%Y")))
...
for mm, r in zip(MegaMillions2019, results.replace(' ','')):
print (f"{mm}, {r}")
Комментарии:
1. Нет, не сработает, поищите
MegaMillions2019
еще раз.2. Нет, этого все равно не произойдет.
Ответ №3:
сохраняйте два списка l1
и l2
, добавляйте даты в l1
в первом цикле и добавляйте список результатов в l2
во втором цикле
пример:
l1=[01222019,01222029,01222013]
l2=[[3,4,5],[1,2,3],[4,5,5]]
затем вы можете сжать оба списка следующим образом:
new_list = [",".join(map(str, (list(a) b))) for a, b in zip(s1, s2)]
теперь вы можете напечатать new_list, результаты которого будут разделены запятыми.
Комментарии:
1. Вы что-то упускаете, поищите
results
в OP. это строка, разделенная запятой.
Ответ №4:
Используйте отдельный список для хранения дат и распечатывайте элементы с помощью zip_longest()
, в случае, если какой-либо элемент списка отсутствует, он будет заполнять его None
вместо отсутствующего элемента:
Создайте итератор, который объединяет элементы из каждой из итерируемых. Если повторяющиеся значения имеют неодинаковую длину, недостающие значения заполняются с помощью fillvalue . Итерация продолжается до тех пор, пока не будет исчерпана самая длинная итерация.
Следовательно:
import requests
from bs4 import BeautifulSoup
from datetime import datetime
response = requests.get('https://www.lotterycorner.com/mi/mega-millions/2019')
soup = BeautifulSoup(response.text, 'html.parser')
date = soup.find_all("td", {"class":"win-nbr-date col-sm-3 col-xs-4"})
megaList = [] # empty list for dates
for date in date:
date2 = (date.get_text())
date = (datetime.strptime(date2, '%b %d, %Y'))
MegaMillions2019 = (date.strftime("%m%d%Y"))
megaList.append(MegaMillions2019)
data = []
for ultag in soup.find_all("ul",{"class":"nbr-grp"}):
for litag in ultag.find_all('li'):
results = (litag.get_text().replace(' ','').replace('MegaBall',''))
data.append(results)
parsed = []
for i in range(int(len(data)/7)):
j = i*7
parsed.append(data[j:j 6])
results = [', '.join(parsed[i]) for i in range(len(parsed))]
results = [i.replace(' ','') for i in results] # remove space from each elem in results
for mg, res in zip_longest(megaList, results):
print(mg, res, sep =',')
ВЫВОД:
03292019,5,14,15,62,66,3
03262019,4,14,22,43,58,9
.
.
01252019,8,16,30,38,61,10
01222019,4,15,37,59,64,16
01182019,2,43,48,62,64,24
.
.
01042019,21,29,35,54,60,15
01012019,34,44,57,62,70,14