�������� ��������� ������,������: ������������ ������.

четверг, 11 февраля 2010 г.

Python sax парсинг, осторожно грабли!

Столкнулся с такой проблемой использую SAX парсер для парсинга XHTML файла и прикаждом вызове функции xml.sax.parse скрипт подвисает на несколько секунд. В начале думал что файл слишком тяжёлый для парсинга, посмотрел загрузку процессора, процессор не грузится! Забил, через несколько дней сижу с вырубленым интернетом, запускаю скрипт и вот тут выскакивает ошибка мол время соединения истекло т.е. таймаут!!! И ошибка указывает на строку 298


f = urllib.urlopen(source.getSystemId())
модуля saxutils. Вот тут я выпал в осадок :))))

Оказалось что в XHTML файле есть доктип:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


и каждый раз при парсинге скрипт рубится в интернет!!!
Погуглив, решения не нашёл как это дело закешировать, не стал рефакторить фукцию prepare_input_source, которая как раз отвечает за выборку доктипа, а просто регепсом
_pat_dtd = re.compile(r'<!doctype [^>]+>' re.I)
убиваю доктип и парсю через parseString, всё!