Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Несколько лет назад я использовал JTidy для той же цели:
"JTidy является портом Java Опрятного HTML, программа проверки синтаксиса HTML и симпатичный принтер. Как его кузен не-Java, JTidy может использоваться в качестве инструмента для чистки уродливого и дефектного HTML. Кроме того, JTidy предоставляет интерфейс DOM документу, который обрабатывается, который эффективно делает Вас способными использовать JTidy в качестве синтаксического анализатора DOM для реального HTML.
JTidy был записан Andy Quick, который позже ушел от обслуживающего положения. Теперь JTidy сохраняется группой волонтеров.
[еще 115] информация о JTidy может быть найдена на странице проекта SourceForge JTidy".
Основной проблемой, как указано путем предшествования комментариям является уродливый HTML, таким образом, инструмент для очистки HTML или преобразователь HTML-XML - необходимость. Как только Вы получаете код XML (XHTML), там много инструментов для обработки его. Вы могли получить его с простым обработчиком SAX, который извлекает только данные, в которых Вы нуждаетесь или любой основанный на дереве метод (DOM, JDOM, и т.д.), которые позволяют Вам даже изменить исходный код.
Вот пример кода, который использует инструмент для очистки HTML для получения всех ОТДЕЛЕНИЙ, которые используют определенный класс и распечатывают все текстовое содержание в нем.
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();
}
}
}
Вам могло бы быть интересно TagSoup, синтаксический анализатор HTML Java, который в состоянии обработать уродливый HTML. Синтаксические анализаторы XML работали бы только над хорошо сформированным XHTML.
Проект HTMLParser ( http://htmlparser.sourceforge.net/ ) мог бы быть возможностью. Это, кажется, довольно достойно при обработке уродливого HTML. Следующий отрывок должен сделать то, в чем Вы нуждаетесь:
Parser parser = new Parser(htmlInput);
CssSelectorNodeFilter cssFilter =
new CssSelectorNodeFilter("DIV.targetClassName");
NodeList nodes = parser.parse(cssFilter);
HTMLUnit мог бы помочь. Это действительно намного больше наполняет также.
Если Ваш HTML правильно построен, можно легко использовать синтаксический анализатор XML, чтобы сделать задание для Вас... Если бы Вы только читаете, , SAX был бы идеален.