Как вы анализируете плохо отформатированный HTML-файл?

StackOverflow https://stackoverflow.com/questions/710677

Вопрос

Мне нужно проанализировать серию веб-страниц, чтобы импортировать данные в приложение.Каждый тип веб-страницы предоставляет один и тот же тип данных.Проблема в том, что 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$, и т.д.Тем не менее, это будет большая работа.Можете ли вы придумать какое-нибудь более простое решение?Есть какая-нибудь библиотека, которая может помочь?

Спасибо

Это было полезно?

Решение

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

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

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

Как уже упоминалось здесь и на другие ответы SO раньше, Прекрасный Суп может анализировать странный HTML.

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

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

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

Используйте синтаксический анализатор HTML5 следующим образом html5lib.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top