Какой самый простительный анализатор HTML в Python? - PullRequest
4 голосов
/ 29 июля 2011

У меня есть некоторый случайный HTML, и я использовал BeautifulSoup для его анализа, но в большинстве случаев (> 70%) он задыхается.Я пытался использовать Beautiful soup 3.0.8 и 3.2.0 (были некоторые проблемы с версией 3.1.0 и выше), но результаты почти такие же.

Я могу вспомнить несколько вариантов парсера HTML, доступных в Python, сверхумоей головы:

  • BeautifulSoup
  • lxml
  • pyquery

Я собираюсь протестировать все это, но я хотел знатькакой из них в ваших тестах оказался самым прощающим и может даже попытаться разобрать плохой HTML.

Ответы [ 4 ]

3 голосов
/ 29 июля 2011

Они все такие. Я еще не встречал ни одной html-страницы, найденной в дикой природе, которую lxml.html не мог разобрать. Если lxml barfs на страницах, которые вы пытаетесь проанализировать, вы всегда можете предварительно обработать их, используя несколько регулярных выражений, чтобы lxml был доволен.

Сам lxml довольно строг, но lxml.html - это другой анализатор, который может работать с очень испорченным html. Для крайне непростых html lxml также поставляется с lxml.html.soupparser, который взаимодействует с библиотекой BeautifulSoup.

Некоторые подходы к разбору сломанного html с использованием lxml.html описаны здесь: http://lxml.de/elementsoup.html

2 голосов
/ 01 августа 2011

Я закончил тем, что использовал BeautifulSoup 4.0 с html5lib для синтаксического анализа, и это намного проще, с некоторыми изменениями в моем коде, теперь он работает довольно хорошо, спасибо всем за предложения.

2 голосов
/ 29 июля 2011

Со страницами, которые не работают ни с чем другим (вспоминаются те, которые содержат вложенные <form> элементы), я добился успеха с MinimalSoup и ICantBelieveItsBeautifulSoup .Каждый может справиться с определенными типами ошибок, которые другие не могут сделать так часто, что вам нужно попробовать оба.

1 голос
/ 29 июля 2011

Если beautifulsoup не решит вашу проблему с html, следующим лучшим решением будет регулярное выражение. lxml, elementtree, minidom очень строги в разборе и на самом деле все делают правильно.

Другие советы:

  1. Я передаю html в браузер lynx через командную строку, вынимаю текстовую версию страницы / содержимого и анализирую с помощью регулярных выражений.

  2. Преобразование html в текст или html в уценку убирает все html тэги, и вы останетесь с текстом. Это легко разобрать.

...