@gndkg

Как парсить если структуры страниц отличаются?

Здравствуйте, есть сайт https://etender.gov.az и там есть таблица с данными и ссылками, и после перехода по ссылкам(текст "Ətraflı"), структура данных может сильно отличатся(в том числе таблицы в разных страницах).
Вот пример:
https://etender.gov.az/main/competition/detail/315080

https://etender.gov.az/main/competition/detail/232454


И мне это все нужно спарсинговать в словарь(только те данные что в этих страницах), я хотел использовать URL с GET параметром, но там иногда бывает много ненужной информации и некоторые тексты пишутся с ошибками. Как мне сделать такой парсинг?

Также возможно мой код пригодится(он не совсем полный):
import requests

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Я сначала думал что все данные по одному шаблону(примерно такому)
all_data = {
    'Satınalan təşkilatın adı': [],
    'Satınalma predmeti': [],
    'Satınalma predmeti': [],
    'Dərc edilmə tarixi': [],
    'Bitmə tarixi': [],
    'Link': {
        'Satınalan təşkilatın adı': [],
        'Satınalan təşkilatın VÖEN-i': [],
        'Satınalan təşkilatın ünvanı': [],
        'Musabiqənin adı': [],
        'Müsabiqənin nömrəsi': [],
        'Təsnifat kodu': [],
        'Ehtimal olunan qiymət': [],
        'Müsabiqənin dərc edilmə tarixi və vaxtı': [],
        'Təkliflərin son təqdim olunma tarixi və vaxtı': [],
        'Zərflərin açılış tarixi və vaxtı': []
    },
    'Linkdəki çərçivə':{
        'Başlıq': [],
        'Açıqlama': [],
        'Miqdar': [],
        'Ölçü vahidi': []
    }
}

def get_general_info(api_link = 'https://etender.gov.az/api/events?EventType=2&PageSize=1&PageNumber=1&EventStatus=1&Keyword=&buyerOrganizationName=&PrivateRfxId=&publishDateFrom=&publishDateTo=&AwardedparticipantName=&AwardedparticipantVoen=&DocumentViewType='):
    responce = requests.get(api_link)
    general_info = []

    if responce.status_code == 200:
        data = responce.json()

        current_page = data['currentPage']
        total_pages = data['totalPages']
        items_on_page = data['itemsInPage']
        total_items = data['totalItems']

        general_info.append(current_page)
        general_info.append(total_pages)
        general_info.append(items_on_page)
        general_info.append(total_items)
        
        return general_info
    
    print(f'Error: {responce.status_code}')
    return general_info 

# возвращает айди каждлго тендера в таблице
def get_all_events_ids(page_size):
    api_link = f'https://etender.gov.az/api/events?EventType=2&PageSize={page_size}&PageNumber=1&EventStatus=1&Keyword=&buyerOrganizationName=&PrivateRfxId=&publishDateFrom=&publishDateTo=&AwardedparticipantName=&AwardedparticipantVoen=&DocumentViewType='

    response = requests.get(api_link)
    data = response.json()

    events_ids = []

    for item in data['items']:
        events_ids.append(item['eventId'])

    return events_ids

# используя фунуцию get_all_events_ids(), возвращает всю информацию о тендере (шаблон ссылки https://etender.gov.az/main/competition/detail/tender_id)
def get_info_from_link(ids):
    all_data = {}
    row_data = []

    driver = webdriver.Chrome()
    for i in range(len(ids)):
        link = f'https://etender.gov.az/main/competition/detail/{ids[i]}'
        driver.get(link)
        ... # код пока что не завершен

    driver.quit()

    return all_data
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы