2008-10-26 7 views
50

Я работаю над приложением, которое сбрасывает данные с веб-сайта, и мне было интересно, как мне нужно собирать данные. В частности мне нужно данные, содержащиеся в ряде Div тегов, которые используют определенный класс CSS - В настоящее время (для целей тестирования) Я просто проверкаJava HTML Parsing

div class = "classname" 

в каждой строке HTML - это работает, но я могу» t помочь, но чувствую, что есть лучшее решение там.

Есть ли хороший способ, где я мог бы дать класс строку HTML и имеют некоторые интересные методы, как:

boolean usesClass(String CSSClassname); 
String getText(); 
String getLink(); 
+1

Связанные: [Каковы плюсы и минусы ведущих парсеров Java HTML?] (Http://stackoverflow.com/questions/3152138/what-are-the-pros-and-cons-of-the-leading -java-html-parsers) – BalusC 2011-08-21 14:06:00

ответ

18

Несколько лет назад я использовал JTidy для тех же целей:.

http://jtidy.sourceforge.net/

«JTidy является портом Java из HTML Tidy, в HTML проверки синтаксиса и довольно принтера Как и не-Java кузином, JTidy может использоваться как инструмент для очистки некорректного и ошибочного HTML. Кроме того, JTidy предоставляет DOM-интерфейс к обрабатываемому документу, что эффективно позволяет использовать JTidy в качестве анализатора DOM для реального HTML-кода HTML .

JTidy был написан Энди Бэком, который позже ушел с позиции помощника. Сейчас JTidy поддерживается группой добровольцев. ...

Более подробную информацию о JTidy можно найти на странице проекта JTidy SourceForge»

0

Если HTML хорошо сформирован, вы можете легко использовать в XML-парсер, чтобы сделать работа для вас ... Если вы только читаете, SAX будет идеальным.

+2

Если ваш HTML-код хорошо сформирован. Это когда-нибудь? – PlexQ 2012-04-22 07:03:28

+2

Почему бы и нет? – Yuval 2012-04-22 12:11:35

+0

, потому что я работаю над проектами с другими людьми, некоторые из которых являются дизайнерами, которые не создают идеальный HTML, и многие другие тоже не делают этого, вдвойне, когда соблазняют. – PlexQ 2012-04-23 21:02:38

13

Возможно, вас заинтересовал TagSoup, Java-анализатор Java, способный обрабатывать неверный HTML. Парсеры XML будут работать только на хорошо сформированном XHTML.

5

Возможно, проект HTMLParser (http://htmlparser.sourceforge.net/) возможен. Кажется, он довольно приличный в обработке искаженного HTML. Следующий фрагмент кода должен делать то, что вам нужно:

Parser parser = new Parser(htmlInput); 
CssSelectorNodeFilter cssFilter = 
    new CssSelectorNodeFilter("DIV.targetClassName"); 
NodeList nodes = parser.parse(cssFilter); 
20

Основная проблема, как указано предшествующими коментарии имеет неверный формат HTML, поэтому HTML-уборщик или HTML-XML конвертер является обязательным. Как только вы получите XML-код (XHTML), есть много инструментов для его обработки. Вы можете получить его с помощью простого обработчика SAX, который извлекает только нужные вам данные или любой древовидный метод (DOM, JDOM и т. Д.), Которые позволяют вам даже модифицировать исходный код.

Вот пример кода, который использует HTML cleaner, чтобы получить все DIV, которые используют определенный класс, и распечатать весь текст внутри него.

import java.io.IOException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

import org.htmlcleaner.HtmlCleaner; 
import org.htmlcleaner.TagNode; 

/** 
* @author Fernando Miguélez Palomo <fernandoDOTmiguelezATgmailDOTcom> 
*/ 
public class TestHtmlParse 
{ 
    static final String className = "tags"; 
    static final String url = "http://www.stackoverflow.com"; 

    TagNode rootNode; 

    public TestHtmlParse(URL htmlPage) throws IOException 
    { 
     HtmlCleaner cleaner = new HtmlCleaner(); 
     rootNode = cleaner.clean(htmlPage); 
    } 

    List getDivsByClass(String CSSClassname) 
    { 
     List divList = new ArrayList(); 

     TagNode divElements[] = rootNode.getElementsByName("div", true); 
     for (int i = 0; divElements != null && i < divElements.length; i++) 
     { 
      String classType = divElements[i].getAttributeByName("class"); 
      if (classType != null && classType.equals(CSSClassname)) 
      { 
       divList.add(divElements[i]); 
      } 
     } 

     return divList; 
    } 

    public static void main(String[] args) 
    { 
     try 
     { 
      TestHtmlParse thp = new TestHtmlParse(new URL(url)); 

      List divs = thp.getDivsByClass(className); 
      System.out.println("*** Text of DIVs with class '"+className+"' at '"+url+"' ***"); 
      for (Iterator iterator = divs.iterator(); iterator.hasNext();) 
      { 
       TagNode divElement = (TagNode) iterator.next(); 
       System.out.println("Text child nodes of DIV: " + divElement.getText().toString()); 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
58

Другая библиотека, которая может быть полезна для обработки HTML, - jsoup. Jsoup пытается очистить неверный HTML и разрешает анализ html в Java с помощью синтаксиса jQuery, аналогичного синтаксису тегов.

http://jsoup.org/

3

nu.validator проект является отличным, высокая производительность HTML парсер, не срезать углы правильностью-накрест.

Validator.nu HTML Parser - это реализация алгоритма синтаксического анализа HTML5 в Java. Парсер предназначен для замены заметок для анализатора XML в приложениях, которые уже поддерживают контент XHTML 1.x с помощью парсера XML и используют SAX, DOM или XOM для взаимодействия с парсером. Низкоуровневая функциональность предоставляется для приложений, которые хотят выполнить собственный IO и поддерживать document.write() со сценариями. Ядро анализатора компилируется в Google Web Toolkit и может быть автоматически переведено на C++. (Возможность перевода C++ в настоящее время используется для портирования анализатора для использования в Gecko.)

1

Вы также можете использовать XWiki HTML Cleaner:

Он использует HTMLCleaner и расширяет его для создания Valid XHTML 1.1 содержания.

4

Давайте не будем забывать Jerry, его jQuery в java: быстрая и краткая библиотека Java, которая упрощает разбор документов HTML, перемещение и манипулирование; включает использование селекторов css3.

Пример:

Jerry doc = jerry(html); 
doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy"); 

Пример:

doc.form("#myform", new JerryFormHandler() { 
    public void onForm(Jerry form, Map<String, String[]> parameters) { 
     // process form and parameters 
    } 
}); 

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