Как можно выполнять парсинг, если структура данных на страницах различается?

Здравствуйте! У меня есть сайт <a href="https://etender.gov.az" rel="nofollow">https://etender.gov.az</a>, на котором размещена таблица с данными и ссылками. При переходе по ссылкам (текст "Ətraflı") структура данных на разных страницах может существенно отличаться. Например, вот два образца страниц: <br/> <a href="https://etender.gov.az/main/competition/detail/315080" rel="nofollow">https://etender.gov.az/main/competition/detail/315080</a> и <a href="https://etender.gov.az/main/competition/detail/232454" rel="nofollow">https://etender.gov.az/main/competition/detail/232454</a>. <br/><br/> Мне необходимо извлечь данные с этих страниц и сохранить их в словарь, при этом используя URL с GET-параметрами. Однако я сталкиваюсь с тем, что на страницах присутствует много ненужной информации и некоторые тексты содержат ошибки. Как правильно организовать парсинг в этой ситуации? <br/><br/> Возможно, мой код будет полезен (хотя он не завершён): <br/> <pre><code class="python">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': [],
    'Dərc edilmə tarixi': [],
    'Bitmə tarixi': [],
    'Link': {
        '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ı': [],
    }
}
  • 30 августа 2024 г. 16:44
Ответы на вопрос 1
Парсинг данных с сайтов с различной структурой содержит множество нюансов и может быть достаточно сложным. Вот несколько шагов и рекомендаций, которые помогут вам организовать процесс парсинга эффективно:

### 1. Анализ структуры данных
Первый шаг — детально проанализировать страницы, с которых вы хотите извлечь данные. Определите, какие данные важны для вас и в каких элементах HTML они находятся. Создайте список ключей (например, 'Satınalan təşkilatın adı', 'Satınalma predmeti' и т.д.), на которые вы хотите ориентироваться.

### 2. Использование библиотек для парсинга
Существует несколько библиотек в Python, которые могут помочь с парсингом данных. Например, `BeautifulSoup`, `lxml` или `html.parser`. В некоторых случаях имеет смысл использовать `Selenium`, если данные загружаются динамически с помощью JavaScript.

### 3. Унификация результатов
Так как структура страниц может существенно отличаться, вам нужно будет создать некоторую логику для обработки различных случаев. Вы можете сделать это с помощью конструкции `try ... except` или многоуровневого подхода к парсингу:

```python
def parse_page(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    data = {}
    
    try:
        data['Satınalan təşkilatın adı'] = soup.find('selector_for_organization_name').text.strip()
    except AttributeError:
        data['Satınalan təşkilatın adı'] = None  # или значение по умолчанию

    try:
        data['Satınalma predmeti'] = soup.find('selector_for_purchase_object').text.strip()
    except AttributeError:
        data['Satınalma predmeti'] = None
    
    # Продолжайте с остальными данными, используя аналогичный подход
    
    return data
```

### 4. Обработка ошибок и исключений
Во время парсинга обязательно обрабатывайте случаи, когда данные могут отсутствовать или структура отличается:

- Используйте конструкции `try ... except`, чтобы избежать сбоев в коде при отсутствии необходимых элементов.
- Записывайте в лог информацию о страницах с ошибками, чтобы знать, какие страницы требуют дальнейшего анализа.

### 5. Сохранение данных
После успешного извлечения данных, сохраните их в структуре, удобной для работы (например, в словарях, JSON или базе данных). В вашем случае можно сделать так:

```python
all_data['Satınalan təşkilatın adı'].append(data['Satınalan təşkilatın adı'])
all_data['Satınalma predmeti'].append(data['Satınalma predmeti'])
# ... и так далее
```

### 6. Автоматизация
Если вы собираетесь парсить большое количество страниц, рассмотрите возможность создания автоматической системы, которая будет обходить ссылки на страницы и выполнять парсинг.

Важный момент: проверьте правила использования API сайта или политику парсинга. Убедитесь, что вы соблюдаете правила и не перегружаете сервер.

### Пример кода
Общий пример:

```python
import requests
from bs4 import BeautifulSoup

all_data = {
    'Satınalan təşkilatın adı': [],
    'Satınalma predmeti': [],
    # другие поля...
}

urls = ['https://etender.gov.az/main/competition/detail/315080', 
        'https://etender.gov.az/main/competition/detail/232454']

for url in urls:
    data = parse_page(url)
    for key in all_data.keys():
        if key in data:
            all_data[key].append(data[key])
```

Этот код будет итерироваться по списку URL, извлекать данные и добавлять их в общий словарь. Настройте селекторы и обработку под ваши нужды и учитывайте особенности структуры страниц.
Похожие вопросы