программирование

Прощай BeautifulSoup, здравствуй html5lib

Dmitry Vasiliev 12:20, 2009 2 27

Один мой хороший приятель как-то посоветовал использовать для обработки HTML библиотеку html5lib. На тот момент я уже использовал BeautifulSoup и поэтому отнесся к предложению прохладно. Через некоторое время я наткнулся на документ для которого BeautifulSoup стабильно выкидывал HTMLParseError и приходилось делать "массаж". В итоге, я решил попробовать, что же за "зверь" такой html5lib.

Пакет 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

nadako's Gravatar

Интересно, спасибо за заметку. :-) Заценим.

Comment by goodguy on 00:50, 2009 2 28

goodguy's Gravatar

Кстати, стоит следить за её обновлениями. Помню на этапе от 0.10 к 0.11 очень много было хороших исправлений, благодаря которым HTMLParser становился всё устойчивей к ошибкам форматирования.

Comment by Andrey Popp on 15:31, 2009 3 1

Andrey Popp's Gravatar

Непонятно только почему он html5lib называется, у меня какие-то ассоциации с HTML 5 возникают :)

Comment by Andrey Popp on 16:38, 2009 3 1

Andrey Popp's Gravatar

Туплю :) Ассоциации не случайны
> ... based on the WHATWG HTML5 specification ...

Comment by bw on 17:20, 2009 3 1

bw's Gravatar

В "супе" 3.0.4 ошибки не возникает. Хотя давно уже перешел на html5lib, она значительно точнее разбирает невалидные документы, хотя и работает она медленнее, в некоторых случаях значительно.

..bw

Comment by Dmitry Vasiliev on 00:11, 2009 3 2

Dmitry Vasiliev's Gravatar

Я вроде это с 3.1.0.1 пробовал. Но в любом случае в реальных документах ошибки более изощренные и у html5lib пока получается лучше с ними справляться.

Add comment

Name:
Email: (Never will be published.)
Web site:
Comment: (Paragraphs divided by empty lines, line breaks and links will be automatically formatted.)