Как экспортировать эти данные, разделенные несколькими столбцами в одной строке, в .csv или .xls, используя Python в BeautifulSoup?

Используйте это:

0?[1-9]|1[012]
  • 07: valid
  • 7: valid
  • 0: не соответствует
  • 00: не соответствует
  • 13: не соответствует
  • 21: не соответствует

Чтобы проверить шаблон как 07/2018, используйте это:

/^(0?[1-9]|1[012])\/([2-9][0-9]{3})$/

(Диапазон дат между 01/2000 по 12/9999)

-4
задан Martin Evans 18 January 2019 в 05:57
поделиться

1 ответ

Первая проблема заключается в том, что вам нужно знать, где находится разделение между призами. Без просмотра текста 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 будет иметь следующий тип формата при загрузке в пакет электронных таблиц:

CSV format

Здесь достаточно много техник Python, которые понадобятся для понимания. grouper Например, один из рецептов itertools . islice() - это способ перебора объекта без необходимости начинать с первой позиции.

Окончательный вывод в файл CSV выполняется с использованием библиотеки CSV Python. Это преобразует списки строк в правильно отформатированные выходные строки. Поскольку данные представлены в формате столбцов, для преобразования списка в список строк требуется хитрость, это делается с помощью zip_longest().

Вероятно, будет полезно, если вы добавите операторы print в код, чтобы увидеть, как выглядят данные.

Обратите внимание, что для сохранения данных непосредственно в формате Excel (.xlsx) вам потребуется установить другую библиотеку, например, вы можете использовать openpyxl или xlwt .

0
ответ дан Martin Evans 18 January 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: