Как вы анализируете плохо отформатированный HTML-файл? - PullRequest
5 голосов
/ 02 апреля 2009

Мне нужно проанализировать серию веб-страниц, чтобы импортировать данные в приложение. Каждый тип веб-страницы предоставляет один и тот же тип данных. Проблема в том, что HTML-код каждой страницы отличается, поэтому расположение данных различается. Другая проблема заключается в том, что HTML-код плохо отформатирован, что делает невозможным использование XML-подобного парсера.

Пока что лучшая стратегия, которую я могу придумать, - это определить шаблон для каждого типа страниц, например:

Шаблон A:

<html>
...
  <tr><td>Table column that is missing a td 
      <td> Another table column</td></tr>
  <tr><td>$data_item_1$</td>
...
</html>

Шаблон B:

<html>
...
  <ul><li>Yet another poorly formatted page <li>$data_item_1$</td></tr>
...
</html>

Таким образом, мне понадобится только один парсер для всех страниц, который будет сравнивать каждую страницу с ее шаблоном и получать $data_item_1$, $data_item_2$ и т. Д. Тем не менее, это будет много работы. Можете ли вы придумать какое-нибудь более простое решение? Любая библиотека, которая может помочь?

Спасибо

Ответы [ 6 ]

8 голосов
/ 02 апреля 2009

Вы можете передать источник страницы через приборку, чтобы получить действительную страницу. Вы можете найти приборку здесь , Tidy имеет привязки для многих языков программирования. После этого вы можете использовать свой любимый метод синтаксического анализа / извлечения контента.

2 голосов
/ 02 апреля 2009

Как уже упоминалось здесь и на других SO-ответах ранее, Beautiful Soup может анализировать странный HTML.

Beautiful Soup - это синтаксический анализатор Python HTML / XML, разработанный для быстрых поворотных проектов, таких как очистка экрана. Три функции делают его мощным:

  1. Прекрасный суп не захлебнется, если вы дадите ему плохую разметку. Это дает дерево разбора, которое имеет примерно такой же смысл, как и ваш исходный документ. Обычно этого достаточно, чтобы собрать нужные данные и убежать.
  2. Beautiful Soup предоставляет несколько простых методов и Pythonic идиом для навигации, поиска и изменения дерева разбора: инструментарий для разбора документа и извлечения того, что вам нужно. Вам не нужно создавать собственный анализатор для каждого приложения.
  3. Beautiful Soup автоматически конвертирует входящие документы в Unicode и исходящие документы в UTF-8. Вам не нужно думать о кодировках, если только в документе не указана кодировка, а Beautiful Soup не может ее автоматически определить. Тогда вам просто нужно указать оригинальную кодировку.

Beautiful Soup анализирует все, что вы ему даете, и выполняет обход дерева для вас. Вы можете сказать ему «Найти все ссылки», или «Найти все ссылки класса externalLink», или «Найти все ссылки, URL-адреса которых соответствуют« foo.com », или« Найти заголовок таблицы, в котором выделен жирный текст, а затем дать мне этот текст. "

2 голосов
/ 02 апреля 2009

Я бы рекомендовал Html Agility Pack . У него есть возможность работать с плохо структурированным HTML, в то же время давая вам выбор в стиле Xml с использованием Xpath. Вам все равно придется шаблонировать элементы или выбирать, используя различные варианты выбора и анализировать, но это поможет вам преодолеть бедную структуру.

1 голос
/ 02 апреля 2009

Используйте HTML5-парсер, например html5lib .

В отличие от HTML Tidy, это даст вам обработку ошибок очень близко к тому, что делают браузеры.

0 голосов
/ 03 апреля 2009

В зависимости от того, какие данные вам нужны для извлечения регулярных выражений, может быть вариант. Я знаю, что многие люди будут содрогаться при мысли об использовании RegExes для структурированных данных, но очевидным фактом (как вы обнаружили) является то, что большая часть HTML на самом деле не очень хорошо структурирована и может быть очень трудно анализировать.

У меня была похожая проблема с вами, но в моем случае я хотел получить только один конкретный фрагмент данных со страницы, который было бы легко идентифицировать без анализа HTML, поэтому RegEx работал очень хорошо.

0 голосов
/ 03 апреля 2009

Здесь есть пара специфичных для C # потоков, например Ищем C # HTML-парсер .

...