Используйте это:
0?[1-9]|1[012]
Чтобы проверить шаблон как 07/2018, используйте это:
/^(0?[1-9]|1[012])\/([2-9][0-9]{3})$/
(Диапазон дат между 01/2000 по 12/9999)
Первая проблема заключается в том, что вам нужно знать, где находится разделение между призами. Без просмотра текста Special Prize
это было бы сложно. Альтернативный подход заключается в использовании find_all()
для определения только td
и th
элементов. Понимание списка дополнительно добавляет только непустые ячейки. Это приведет к единому списку, содержащему все необходимые данные.
cols
содержит список обязательных столбцов. Это заполняется вручную для 1-го, 2-го и 3-го призов, так как эти записи должны быть исправлены. Затем используется петля для добавления соответствующих букв и призов в последние четыре столбца.
Функция Python groupby()
может использоваться для группировки списков в подгруппы, разделенные элементами, найденными в split_on
.
from itertools import groupby, zip_longest, islice
from bs4 import BeautifulSoup
import requests
import csv
def grouper(iterable, n):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip(*args)
response = requests.get("http://perdana4d.com/resulten.php")
soup = BeautifulSoup(response.content, 'lxml')
rows = [cell.get_text(strip=True) for cell in soup.find_all(['td', 'th']) if len(cell.get_text(strip=True))]
draw_date = rows[2].split(' ')[-1]
split_on = ['Special Prize', 'Consolation Prize']
cols = [
['Date', draw_date],
['FirstL', rows[7]],
['FirstP', rows[8]],
['SecondL', rows[9]],
['SecondP', rows[10]],
['ThirdL', rows[11]],
['ThirdP', rows[12]],
['SpecialL'],
['SpecialP'],
['ConsolationL'],
['ConsolationP']
]
col_l = islice(cols, 7, None, 2)
col_p = islice(cols, 8, None, 2)
for k, g in groupby(rows[13:], lambda x: x not in split_on):
if k:
l = next(col_l)
p = next(col_p)
for letter, prize in grouper(g, 2):
l.append(letter)
p.append(prize)
with open('output.csv', 'w', newline='') as f_output:
csv.writer(f_output).writerows(zip_longest(*cols, fillvalue=''))
Это приведет к тому, что файл CSV будет иметь следующий тип формата при загрузке в пакет электронных таблиц:
Здесь достаточно много техник Python, которые понадобятся для понимания. grouper
Например, один из рецептов itertools . islice()
- это способ перебора объекта без необходимости начинать с первой позиции.
Окончательный вывод в файл CSV выполняется с использованием библиотеки CSV Python. Это преобразует списки строк в правильно отформатированные выходные строки. Поскольку данные представлены в формате столбцов, для преобразования списка в список строк требуется хитрость, это делается с помощью zip_longest()
.
Вероятно, будет полезно, если вы добавите операторы print в код, чтобы увидеть, как выглядят данные.
Обратите внимание, что для сохранения данных непосредственно в формате Excel (.xlsx) вам потребуется установить другую библиотеку, например, вы можете использовать openpyxl или xlwt .