Пакет html5lib оказался отличным инструментом - кроме того, что он очень терпимо относится к действительно "кривым" документам он еще и позволяет использовать различные интерфейсы для доступа к дереву документа, в том числе поддерживается и интерфейс BeautifulSoup! Вот достаточно интересный пример:
Если взять "плохой" документ следующего вида:
<div id=id"> Bad HTML
То при использовании BeautifulSoup мы получим HTMLParseError:
>>> from BeautifulSoup import BeautifulSoup >>> f = open("test.html", "rb") >>> soup = BeautifulSoup(f) Traceback (most recent call last): ... HTMLParser.HTMLParseError: malformed start tag, at line 1, column 11
В случае же html5lib документ будет успешно обработан (плюс, здесь используется интерфейс BeautifulSoup):
>>> import html5lib >>> from html5lib import treebuilders >>> f = open("test.html", "rb") >>> parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup")) >>> soup = parser.parse(f) >>> print soup.prettify() <html> <head> </head> <body> <div id='id"'> Bad HTML </div> </body> </html>
Comments All comments
Comment by nadako on 00:04, 2009 2 28
Интересно, спасибо за заметку. :-) Заценим.
Comment by goodguy on 00:50, 2009 2 28
Кстати, стоит следить за её обновлениями. Помню на этапе от 0.10 к 0.11 очень много было хороших исправлений, благодаря которым HTMLParser становился всё устойчивей к ошибкам форматирования.
Comment by Andrey Popp on 15:31, 2009 3 1
Непонятно только почему он html5lib называется, у меня какие-то ассоциации с HTML 5 возникают :)
Comment by Andrey Popp on 16:38, 2009 3 1
Туплю :) Ассоциации не случайны
> ... based on the WHATWG HTML5 specification ...
Comment by bw on 17:20, 2009 3 1
В "супе" 3.0.4 ошибки не возникает. Хотя давно уже перешел на html5lib, она значительно точнее разбирает невалидные документы, хотя и работает она медленнее, в некоторых случаях значительно.
..bw
Comment by Dmitry Vasiliev on 00:11, 2009 3 2
Я вроде это с 3.1.0.1 пробовал. Но в любом случае в реальных документах ошибки более изощренные и у html5lib пока получается лучше с ними справляться.
Add comment