Извлечение и очистка фрагмента HTML с использованием анализатора HTML (org.htmlparser) - PullRequest
6 голосов
/ 02 декабря 2011

Я ищу эффективный подход к извлечению фрагмента HTML из веб-страницы и выполнению некоторых определенных операций с этим фрагментом HTML.

Требуемые операции:

  1. Удалить все теги, которые имеют класс «скрытый»
  2. Удалить все теги сценария
  3. Удалить все теги стиля
  4. Удалить все атрибуты события (on * = "*")
  5. Удалить все атрибуты стиля

Я использовал HTML Parser (org.htmlparser) для этой задачи и смог выполнить все требованияОднако я не чувствую, что у меня есть элегантное решение.В настоящее время я анализирую веб-страницу с помощью CssSelectorNodeFilter (чтобы получить фрагмент) и затем повторно анализирую этот фрагмент с помощью NodeVisitor , чтобы выполнить операции очистки.

Кто-нибудь может подсказать, как они будут решать эту проблему?Я бы предпочел только один раз проанализировать документ и выполнить все операции во время этого одного анализа.

Заранее спасибо!

1 Ответ

7 голосов
/ 02 декабря 2011

Проверьте jsoup - он должен элегантно выполнять все ваши необходимые задачи.

[Изменить]

Вот полный рабочий пример для ваших необходимых операций:

// Load and parse the document fragment.
File f = new File("myfile.html"); // See also Jsoup#parseBodyFragment(s)
Document doc = Jsoup.parse(f, "UTF-8", "http://example.com");

// Remove all script and style elements and those of class "hidden".
doc.select("script, style, .hidden").remove();

// Remove all style and event-handler attributes from all elements.
Elements all = doc.select("*");
for (Element el : all) { 
  for (Attribute attr : el.attributes()) { 
    String attrKey = attr.getKey();
    if (attrKey.equals("style") || attrKey.startsWith("on")) { 
      el.removeAttr(attrKey);
    } 
  }
}
// See also - doc.select("*").removeAttr("style");

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

...