ProxyWing

Ошибка парсинга в Python: как найти причину и исправить

Ошибка парсинга означает, что программа не смогла разобрать входной текст по правилам выбранного формата. В Python это может быть синтаксис самого кода, XML-документ или JSON-ответ. Сначала найдите название исключения в конце сообщения: от него зависит дальнейшая проверка.

Опубликовано: 26 января 2026 г.
Время чтения: 12 мин
Обновлено: 23 октября 2026 г.

Определите, что разбирается в момент ошибки: файл .py, XML или JSON. Затем проверьте указанный файл, строку и исходные данные. Смена прокси не исправляет синтаксис Python.

Быстрая диагностика по названию ошибки

Исключение Что проверять
SyntaxError Двоеточия, скобки, кавычки, операторы и версию Python
IndentationError Структуру блоков и уровни отступа
TabError Неоднозначное смешение табуляции и пробелов
xml.etree.ElementTree.ParseError XML-документ, теги и кодировку
json.JSONDecodeError JSON-строку, разделители и фактическое содержимое ответа
NameError Определена ли переменная или функция
Тип исключения помогает определить, проверять ли код Python или входные данные.

NameError возникает при выполнении синтаксически допустимого кода. Исправление кавычек или отступов не поможет, если программа обращается к отсутствующему имени.

Что значит SyntaxError в Python

Перед выполнением Python разбирает и компилирует код модуля. Если его структура нарушает грамматику языка, возникает SyntaxError и этот модуль не начинает обычное выполнение.

Parse Error в Python

Такое исключение может появиться и во время работы другой части программы: например, при импорте повреждённого модуля или разборе строки через compile, eval либо exec. Поэтому формулировка «любая ошибка парсинга бывает только до запуска программы» слишком широка.

PEP 8 описывает рекомендуемый стиль оформления. Его нарушение само по себе не обязательно вызывает SyntaxError.

Где найти строку с ошибкой

В терминале или окне Run редактора найдите имя исключения и текст после него. Рядом обычно указаны путь к файлу, номер строки и фрагмент исходного кода. Каретка или подчёркивание показывают место, где парсер обнаружил проблему.

Причина может находиться выше: незакрытая скобка меняет разбор следующих строк. Откройте именно файл из сообщения, проверьте указанную строку и начало текущего блока. Сохраните изменения перед повторным запуском.

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

Частые причины SyntaxError

Пропущено двоеточие

Ниже намеренно ошибочный пример:

x = 6
if x > 5
    print("Hi")

Исправленный самостоятельный пример:

x = 6
if x > 5:
    print("Hi")

Результат: Hi. Между if и x нужен пробел. Добавление одного двоеточия к строке ifx > 5 ошибку не исправляет.

Незакрыты кавычки или скобки

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

print("Hello")

При незавершённой конструкции старые версии Python могут сообщать unexpected EOF while parsing. Новые версии часто точнее указывают незакрытую скобку или строку. Проверяйте начало конструкции, даже если сообщение указывает на конец файла.

Присваивание вместо сравнения

Для проверки равенства используется ==:

x = 5
if x == 5:
    print("Equal")

Обычный знак = в условии if x = 5 недопустим. Оператор := имеет отдельное назначение и не заменяет сравнение.

Пропущена запятая

Элементы списка разделяются запятыми:

numbers = [1, 2, 3]
print(numbers)

Есть исключение, которое легко пропустить: соседние строковые литералы могут склеиться без ошибки. Запись [“red” “blue”] создаёт один элемент “redblue”. Проверяйте результат, даже если код запустился.

Опечатки и символы после копирования

Для объявления функции нужно ключевое слово def:

def greet():
    print("Hello")

greet()

Опечатка deff в объявлении функции нарушает синтаксис. Опечатка prnit в вызове обычно приводит к NameError при выполнении. Типографские кавычки и неразрывные пробелы из документа замените обычными символами в редакторе кода.

SyntaxError и IndentationError

IndentationError относится к подклассам SyntaxError и относится к структуре блоков. TabError входит в эту группу и указывает на некорректное использование табуляции и пробелов.

У сообщения expected an indented block проверьте строку после if, for, while, def, class или другой конструкции с блоком. При unexpected indent ищите лишний уровень отступа. При unindent does not match any outer indentation level сравните отступ с началом соседних блоков.

Как исправить отступы

В этом примере ошибка намеренная: строка print должна входить в блок if.

x = 12
if x > 10:
print("High value")

Исправление:

x = 12
if x > 10:
    print("High value")

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

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

Как читать сообщение об ошибке и traceback

  1. Найдите последнее сообщение с типом исключения.
  2. Откройте путь к файлу, указанный для ошибочного кода.
  3. Проверьте номер строки и выделенный фрагмент.
  4. Просмотрите незавершённые конструкции выше.
  5. Уменьшите пример до нескольких строк, которые воспроизводят ошибку.

При синтаксической ошибке основного файла вывод может содержать только место ошибки без полного стека вызовов. При ошибке импорта или разбора данных traceback показывает, откуда был вызван проблемный код. Не ориентируйтесь только на последнюю строку своего скрипта.

Как проверить файл после исправления

Сохраните проблемный скрипт под именем app.py в текущей папке. Для проверки компиляции выполните в терминале:

python -m py_compile app.py

Команда не выполняет обычные инструкции скрипта. При успешной проверке она обычно не печатает сообщение и создаёт файл байт-кода в pycache. На системе, где Python 3 запускается командой python3, используйте её вместо python.

После успешной проверки запустите:

python app.py

Теперь могут проявиться ошибки выполнения, например NameError или ValueError. Исправляйте их отдельно. Успешная компиляция не проверяет результат вычислений, доступность сети и содержимое входных файлов.

Как предотвращать повторные ошибки

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

Линтер помогает находить часть проблем до запуска. Форматировщик часто требует уже разбираемый код и не исправляет произвольный SyntaxError. Перед сохранением изменений в репозитории выполняйте проверку компиляции и тесты ожидаемого поведения.

Ошибки парсинга XML и JSON

ParseError при чтении XML

У xml.etree.ElementTree ошибка ParseError относится к входному XML. Например, теги открываются и закрываются разными именами:

import xml.etree.ElementTree as ET

try:
    ET.fromstring("<book><title>Python</book>")
except ET.ParseError as error:
    print("Ошибка XML:", error)

Этот Python-код корректен и перехватывает ошибку XML. Проверьте парность тегов, корневой элемент и кодировку. Работа с документами разобрана в руководстве по XML в Python.

JSONDecodeError при чтении JSON

JSON требует двойных кавычек для строковых ключей и не допускает завершающую запятую после последнего элемента. Пример корректного разбора:

import json

data = json.loads('{"status": "ok", "count": 2}')
print(data["count"])

Если JSON пришёл по сети, сначала проверьте HTTP-статус и фактическое тело ответа. Вместо данных могла прийти пустая строка, HTML-форма входа или страница ошибки. Не передавайте такой ответ в json.loads без проверки.

ParseError в XML и JSONDecodeError в JSON относятся к разбору данных. Для сетевого ответа сначала проверьте HTTP-статус.

Если ошибка возникла в скрипте парсинга сайта

Разделите два этапа: получение ответа и разбор его содержимого. Сначала подтвердите, что сервер вернул нужные данные, затем проверяйте формат. Порядок сетевой диагностики описан в статье о прокси для парсинга.

Если для разрешённого сбора данных нужен запрос через определённый регион или внешний IP, выберите прокси для парсинга в ProxyWing. Прокси меняет сетевой маршрут. Синтаксис кода и повреждённый XML или JSON нужно исправлять отдельно.

Для резидентских прокси действует промокод WINGRESI10: скидка 10% на резидентские прокси ProxyWing.

Статью написал:

Alexandre Parfonov

Фулстек AI-инженер

Александр привносит в инженерную команду Proxywing глубокую фулстек-экспертизу — от архитектуры бэкенда и оптимизации производительности до AI-ориентированных процессов разработки. Его практический опыт охватывает Node.js, React, облачную инфраструктуру и RAG-пайплайны, что позволяет одинаково уверенно работать как с внутренней логикой прокси-платформы, так и с пользовательской частью продукта. В Proxywing Александр сосредоточен на проектировании отказоустойчивых систем, устранении узких мест производительности и внедрении современных AI-инструментов в процесс разработки. Вне кода он увлечён исследованием передовых подходов в AI-инженерии и созданием сайд-проектов, расширяющих технические горизонты.

Все статьи автора (58)

Ответы на часто задаваемые вопросы

Эта ошибка происходит, когда интерпретатор Python доходит до конца файла, но ожидает продолжения кода. Частые причины: незакрытые кавычки, незакрытые скобки или незавершенный блок кода.

Чтобы найти ошибку, прочитайте ее тип. Проверьте номер строки. Посмотрите на каретку (^). И обязательно инспектируйте строки выше и ниже указанного места.

Нет. По умолчанию Python не может исправлять ошибки анализа сам. Однако использование современных IDE, таких как Sublime Text или VS Code, помогает подсветить эти проблемы. Это делает их исправление намного проще.