2014-01-26 1 views
2

Я хотел бы иметь возможность эффективно анализировать большие HTML-документы в Python. Я знаю Liza Daly's fastiter и similar concept in the Python's own cElementTree. Однако ни один из них не обрабатывает сломанный XML, который HTML читает, как хорошо. Кроме того, документ может содержать другой сломанный XML.Эффективный разбор разбитого XML/HTML в python

Аналогично, я знаю ответы, такие как this, в которых предлагается не использовать какую-либо форму iterparse вообще, и это, по сути, то, что я использую. Тем не менее, я пытаюсь оптимизировать прошлое самого большого узкого места в моей программе, что является разбором документов.

Кроме того, я немного экспериментировал с использованием обработчика целевых объектов SAX для парсеров lxml. Я не уверен, что происходит, но это прямо заставляет Python прекратить работать! Не просто исключение, но всплывающее сообщение «python.exe перестало работать». Я не знаю, что здесь происходит, но я даже не уверен, что этот метод на самом деле лучше, чем стандартный парсер, потому что я очень мало об этом видел в Интернете.

Таким образом, мой вопрос: есть ли что-то похожее на iterparse, что позволяет мне быстро и эффективно анализировать документ, который не бросает фальсификацию, когда документ плохо сформирован. XML (IE. восстановление из плохо сформированного XML)?

+1

Посмотрите на BeautifulSoup. –

+0

Возможный дубликат http://stackoverflow.com/questions/3577652/how-to-parse-broken-xml-in-python –

+1

Beautifulsoup патетически медленный, из того, что я помню! Глядя на этот дубликат: Нет, не совсем. Это не только объекты HTML; это также такие вещи, как '&&', разбросанные по всему, что делает синтаксический анализатор XML подходящим. – Firnagzen

ответ

0

Я бы использовал этот.

https://github.com/iogf/ehp

Это быстрее, чем LXML и обрабатывает сломанный HTML, как.

from ehp import * 

doc = '''<html> 
<body> 
<p> cool </html></body>''' 

html = Html() 
dom = html.feed(doc) 
print dom 

Он строит AST в соответствии с возможной возможной структурой HTML. Тогда вы можете работать над АСТ.