2015-07-04 1 views
2

I asked about using BeautifulSoup to parse a very large (270MB) HTML file and getting a memory error andwas pointed toward ElementTree as a solution.Синтаксических очень большой HTML-файл с Python (ElementTree?)

Я пытался использовать их управляемые события синтаксического, documented here. Тестирование его с помощью файла с меньшими настройками работало нормально:

>>> settings = open('S:\\Documents\\FacebookData\\html\\settings.htm') 
>>> for event, element in ET.iterparse(settings, events=("start", "end")): 
    print("%5s, %4s, %s" % (event, element.tag, element.text)) 

Успешно печатает элементы. Однако, используя тот же код с «messages.htm» вместо «settings.htm» просто чтобы увидеть, если он работает еще до начала самого процесса кодирования, это результат:

Traceback (most recent call last): 
    File "<pyshell#16>", line 1, in <module> 
    for event, element in ET.iterparse(source, events=("start", "end")): 
    File "C:\Program Files (x86)\Python\lib\xml\etree\ElementTree.py", line 1294, in __next__ 
for event in self._parser.read_events(): 
    File "C:\Program Files (x86)\Python\lib\xml\etree\ElementTree.py", line 1277, in read_events 
raise event 
    File "C:\Program Files (x86)\Python\lib\xml\etree\ElementTree.py", line 1235, in feed 
self._parser.feed(data) 
    File "<string>", line None 
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 6 

Я интересно, если это потому, что ET лучше подходит для анализа XML-документов? Если это так, и нет обходного пути, я вернусь к первому. Любые предложения о том, как разбирать этот файл, а также о том, как отлаживать по пути, будем очень благодарны!

+0

попробовать HTML-Parser из LXML. – Daniel

+0

[Итеративный анализ HTML (с помощью lxml?)] (Http://stackoverflow.com/questions/8477627/iteratively-parsing-html-with-lxml) – har07

ответ

0

Хорошим решением для разбора HTML или XML является lxml и xpath.

Чтобы использовать XPath:

from lxml import etree 
data = open('result.html','r').read() 
doc = etree.HTML(data) 

for tr in doc.xpath('//table/tr[@class="trmenu1"]'): 
    print tr.xpath('./td/text()') 
0

Html не является идеальным XML. Вот почему в некоторых случаях вы используете HTMLParser вместо ElementTree для разбора html-файла.

Самое лучшее отношение Эммануэль

Смежные вопросы