Заказчик
Зарегистрирован: 5 месяцев
Отзывы + 0 / - 0

Заказ закрыт
Парсинг таблиц

Бюджет: по договоренности
Задача
1. Цель проекта
Разработать для каждого из ~50 сайтов отдельный Python3.11-скрипт, обёртку вокруг готового парсера, по шаблону функции parse_direction(short_url).
Скрипт должен:
1. Принимать жёстко заданный в коде относительный URL (short_url), вида "/path/page.html".
2. Формировать полный URL:
BASE_URL = " domain.com"
url = BASE_URL + short_url
3. Вызывать модуль parser_module для загрузки и разбора HTML.
4. Обрабатывать результаты валидации и возвращать два списка списков:
o res_list— строки, успешно прошедшие валидацию
o errlist— строки с ошибками
5. Логировать ход работы вstdout (INFO/ERROR).
Примечание: пример функции ниже носит иллюстративный характер. Вы можете использовать свой стек и алгоритм разбора таблиц, но главное — сохранить тот же интерфейс (входные параметры, вызовы внешних методов и формат выходных данных), чтобы скрипт легко интегрировался в наше ПО.
________________________________________
2. Источники данных
• Веб-страницы (~50, позже до 500) со статичным HTML (без AJAX/API).
• Аутентификация и анти бот отсутствуют.
________________________________________
3. Структура таблиц
• Все таблицы однотипные, с фиксированным небольшим количеством столбцов (20).
• Порядок и названия столбцов идентичны на всех страницах (детали скрыты). На разных сайтах могут незначительно отличаться.
• Пустые ячейки представлять как пустую строку "".
________________________________________
4. Функция parse_direction
def parse_direction(short_url: str) -> Tuple[List[List[Any]], List[List[Any]]]:
"""
1. Если short_url пустой лог ERROR и return [], [].
2. url = " domain.com" + short_url
3. html = parser_module.fetch_and_save(url, ...) # сохранность не нужна, модуль сам сохраняет
4. soup = BeautifulSoup(html, 'lxml')
5. table = soup.find("table", class_="…")
- Если table пусто лог ERROR и return [], [].

a. rows = parser_module.tableDataText(table) # List[List[str]]
b. header = rows[0]; data_rows = rows[1:]
c. column1_id, column2_id, column3_id = parser_module.GetColumnID(header)
- При отсутствии обязательных колонок лог ERROR, пропуск таблицы
d. Для каждой data_row:
- Извлечь column1_id, column2_id (если есть), column3_id
- t, err = validation.validate_adm_id(column1_id)
- Если t=False errlist.append([...]), иначе res_list.append([...])
7. current_pct = parser_module.countErrorsOnList(res_list, errlist)
- Если current_pct > 0.2 и (len(res_list)+len(errlist)) 5 лог ERROR и return [], []
- Иначе лог INFO и return (res_list, errlist)
"""
Модуль parser_module (с методами fetch_and_save, tableDataText, GetColumnID, countErrorsOnList) и validation предоставляются заказчиком.
________________________________________
5. Логирование
• INFO:
o URL, число таблиц, число обработанных строк, процент ошибок.
• ERROR:
o Пустой short_url
o Нет таблиц
o Не найдены обязательные колонки
o Превышен порог ошибок
o Исключения при разборе
Пример:
print(f"INFO: URL={url}, tables={len(tables)}, rows={len(res_list)+len(errlist)}, errors_pct={current_pct:.1%}")
print(f"ERROR: No tables found at {url}")
________________________________________
6. Файловая структура и запуск
• Каждый сайт в своём файле, напр., site1_parse.py:
from parser_module import fetch_and_save, tableDataText, GetColumnID, countErrorsOnList
import validation

def parse_direction(short_url: str):
# …реализация…
return res_list, errlist

if __name__ == "__main__":
res_list, errlist = parse_direction('/page/list1.html')
print("Valid rows:", len(res_list))
print("Invalid rows:", len(errlist))
• Зависимости перечислить в requirements.txt.
________________________________________
7. Вход/выход
• Вход: жёстко прописанный short_url в каждом скрипте.
• Выход:
o Вstdout: логи INFO/ERROR.
________________________________________
Готовый код и все вспомогательные методы предоставим до старта.
Все детали обсуждаемы и корректируемы до начала работ — ваша задачалишь обеспечить нужный интерфейс и формат данных.
Опубликован 29.07.2025 в 17:22
Заказ находится в архиве

Выберите способ верификации:

Обновите страницу после прохождения верификации.