2010-01-30 2 views
160

Я кодирую много парсеров. До сих пор я использовал браузер без заголовка HtmlUnit для разбора и автоматизации браузера.Какой HTML Parser является лучшим?

Теперь я хочу разделить обе задачи.

Поскольку 80% моей работы связано только с синтаксическим разбором, я хочу использовать легкий парсер HTML, потому что в HtmlUnit требуется много времени, чтобы сначала загрузить страницу, затем получить исходный код и затем проанализировать его.

Я хочу знать, какой HTML-парсер является лучшим. Парсер будет лучше, если он близок к парсеру HtmlUnit.


EDIT:

К лучшим, я хочу, по крайней мере, следующие функции:

  1. Скорость
  2. Удобство найти любой HTMLElement его "ид" или "имя" или "тип тега".

Было бы хорошо, если бы он не очистил грязный HTML-код. Мне не нужно очищать HTML-источник. Мне просто нужен простой способ перемещения по HtmlElements и сбор данных из них.

+2

Как вы относитесь к «лучшим»? Вы имеете в виду скорость, легкость перехода от текущей реализации, соблюдение стандартов W3C, что-то еще, о чем я не думал? Ваш вопрос подразумевает скорость, но также подразумевает время перехода на развитие.Некоторые разъяснения могут помочь другим в рекомендации хороших парсеров, которые будут лучше соответствовать вашим потребностям. – aperkins

+2

Ваше заявление «Я кодирую много парсеров», похоже, не связано с вопросом. Вы имеете в виду «Мне нужно много раз использовать html-парсеры?» – blank

+8

Я думаю, что этот вопрос достаточно конкретный, чтобы быть освобожденным от «неконструктивной» близкой причины. –

ответ

339

Self plug: Я только что выпустил новый Java-парсер Java: jsoup. Я упоминаю это здесь, потому что я думаю, что он будет делать то, что вам нужно.

Его партия трюк является синтаксис CSS селектор, чтобы найти элементы, например .:

String html = "<html><head><title>First parse</title></head>" 
    + "<body><p>Parsed HTML into a doc.</p></body></html>"; 
Document doc = Jsoup.parse(html); 
Elements links = doc.select("a"); 
Element head = doc.select("head").first(); 

Смотрите Selector Javadoc для получения дополнительной информации.

Это новый проект, поэтому любые идеи для улучшения очень приветствуются!

+12

Эта вещь фантастическая, и мне нравится поддержка селектора CSS. Я почти не знаю, что использую библиотеку Java. :-) –

+14

Не останавливайтесь на этом. Это именно то, что нам нужно для анализа HTML с использованием серверной Java! Это круто! Я создал прокси всего за пару часов, который модифицирует все ссылки src и href, чтобы сделать их полными путями на исходный сервер. – jmort253

+6

Я только что взглянул на него. Мне нравится его интерфейс и документация. Это легко понять. :) – Emerald214

28

Лучшее, что я видел до сих пор является HtmlCleaner:

HtmlCleaner является открытым исходным кодом HTML парсер написан на Java. HTML, найденный в Интернете, обычно грязный, плохо сформированный и непригодный для дальнейшей обработки. Для любого серьезного потребления таких документов необходимо сначала очистить беспорядок и привести порядок в теги, атрибуты и обычный текст. Для данного HTML-документа HtmlCleaner переупорядочивает отдельные элементы и создает хорошо сформированный XML. По умолчанию он использует аналогичные правила, используемые большинством веб-браузеров для создания Document Object Model. Однако пользователь может предоставить настраиваемый тег и набор правил для фильтрации и балансировки тегов.

С помощью HtmlCleaner вы можете найти любой элемент, используя XPath.

Для других анализаторов html см. this SO question.

+0

Вы должны обрабатывать прокси-сервер самостоятельно, а затем использовать HtmlCleaner для обработки вашего потока. => Это не удобно. T__T – kidnan1991

+0

Не будет ли HTMLTidy лучшим вариантом здесь? http://www.html-tidy.org/ –

+0

'Подобные правила, которые используют большинство веб-браузеров' - Это не очень убедительно – pguardiario