Быстрое преобразование нескольких элементов HTML в файл CSV в Python - PullRequest
1 голос
/ 09 мая 2020

Мне нужно извлечь данные из нескольких файлов html и преобразовать их в один файл csv. Поскольку страница html абсолютно неструктурирована, задача становится утомительной. Как только я закончил задачу, тестовый запуск прошел успешно для 1, 2 ... 10 файлов, но после этого он начинает занимать много времени. Для 100+ файлов он почти рушится. Я перепробовал 340 файлов. Это работало, но заняло не менее 3 часов, и в конце машина зависла. Вставка полного кода ниже с приложением к примеру файла html (исходный код). Есть ли лучший способ обработки? Примечание: я уже проверял этот ответ , и это не очень помогает. Спасибо.

Ответы [ 3 ]

1 голос
/ 09 мая 2020

В dict all_list накапливаются данные из всех файлов. Я рекомендую писать одну строку для каждого извлечения данных следующим образом:

df = dictionary[['CNR Number', 'Filing Number', 'Filing Date', 'First Hearing', 'Next Hearing', 'Stage of Case', 'Registration Number', 'Year', 'FIR Number', 'Police Station', 'Court Number and Judge',  'PoA', 'IPC', 'PCR', 'PCSO', 'Any Other Act', 'Name of the Petitioner', 'Name of the Advocate', 'Name of the Respondent']]
one_case=''
for i in df:
    one_case=i+','
one_case=one_case+'\n'
outputFile = open('output.csv', 'a')
outputFile.write(one_case)
outputFile.close()

индекс dict фиксирован, поэтому каждый случай может быть помещен в отдельную строку, а файл, разделенный запятыми, может быть добавлен для каждого обработанного html файла.

1 голос
/ 09 мая 2020

Вы сохраняете все строки csv в список словарей и используете только pandas в конце для создания файла CSV. Вместо того, чтобы хранить все данные в памяти, вы можете использовать csv.DictWriter для записи файла csv по одной строке за раз.

Я переместил работу в функции, чтобы упростить эксперименты с многопроцессорностью . Поскольку ваша работа требует значительного количества процессоров, вы можете обнаружить, что группа работников выполняет свою работу быстрее.

import multiprocessing as mp

def convert_html_case_files_to_csv():

    output_filename = os.path.join('/home/some path name/ file' + str(
        datetime.datetime.now().day) + '_' + str(datetime.datetime.now().month) + '_' + str(
        datetime.datetime.now().year) + '.csv')
    # wilding guessing 4 processors sounds good...
    with mp.Pool(4) as pool:
        with open(output_filename, 'w', newline='') as f:
            writer = csv.DictWriter(f, header)
            writer.writerows(pool.imap_unordered(process_case_file, 
                glob.glob(os.path.join(root_dir, '**/*.html'), recursive=True)))
0 голосов
/ 09 мая 2020

Я однажды проделал нечто подобное с кортами Дэни sh.

Я обнаружил, что язык в этом деле был ограничен: адвокат, судья, ответчик, номера дел, коды того и другого, но даже если содержание было структурировано примерно одинаково, суды использовали разные шаблоны и способы их представления, даже если все страницы выглядят одинаково.

Итак, я сначала преобразовал их в обычный текст с l xml (вы, вероятно, можете использовать суп)

Затем я использовал массив регулярных выражений для извлечения нужного мне содержимого и примитивный конечный автомат, чтобы запоминать, где я был, когда это необходимо. Я помню, что часто использовал прямой поиск

(?=...) 

, чтобы убедиться, что я не съел часть следующего текста, который хотел найти.

Это заняло время, но, наконец, я получил их все . Потом «Они» исключили возможность это сделать и закрыли меня.

Осведомленные граждане не всегда счастливы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...