2011-12-02 20 views
6

Poszukuję efektywnego podejścia do wyodrębniania fragmentu HTML ze strony internetowej i wykonywania pewnych operacji na tym fragmencie HTML.Wyciąganie i czyszczenie fragmentu HTML przy użyciu parsera HTML (org.htmlparser)

operacje wymagane są:

  1. usunąć wszystkie znaczniki, które mają klasę „ukrytym”
  2. Usuń wszystkie znaczniki skryptów
  3. Usuń wszystkie znaczniki stylu
  4. usuń wszystkie atrybuty zdarzenia (na * = "*")
  5. Usuń wszystkie atrybuty stylu

Używałem do tego zadania HTML Parser (org.htmlparser) i byłem w stanie spełnić wszystkie wymagania, jednak nie uważam, że mam eleganckie rozwiązanie. Obecnie analizuję stronę WWW za pomocą CssSelectorNodeFilter (w celu pobrania fragmentu), a następnie ponownie analizuję ten fragment za pomocą NodeVisitor w celu przeprowadzenia operacji czyszczenia.

Czy ktoś może zasugerować, w jaki sposób rozwiązałby ten problem? Wolałbym tylko przeanalizować dokument raz i wykonać wszystkie operacje podczas tej jednej analizy.

Z góry dziękuję!

Odpowiedz

6

Zapoznaj się z jsoup - powinien obsłużyć wszystkie niezbędne zadania w elegancki sposób.

[Edytuj]

Oto pełna przykład pracuje na swoje wymaganych operacji:

// 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"); 

będziemy chcieli, aby upewnić się rzeczy takie jak wrażliwość przypadku nie mają znaczenia dla nazw atrybutów, ale to powinna być większość tego, czego potrzebujesz.

+0

Spojrzę na jsoup. Jeśli zapewnia lepsze ramy dla rozwiązania mojego problemu, przedstawię odpowiedź, zalecając jego użycie dla moich wymagań. Dzięki za wskazówkę. –

+0

@KieranHall: zobacz moją zaktualizowaną odpowiedź z roboczym przykładem. – maerics

+0

jak uzyskać zwracany ciąg po usunięciu atrybutu? –