※ ChatGPTを利用し、要約された質問です(原文:ParserDelegator.parse(Unknown Source))
エラーを出さずにhtmlをパースする方法
このQ&Aのポイント
以下のコードを実行するとエラーが発生し、htmlをパースすることができません。エラーを回避する方法を教えてください。
java.lang.NullPointerExceptionが発生していて、ParserTest$MyCallBack.handleTextメソッド内の78行目でエラーが発生しています。
引数で指定されたURLのHTMLファイルを取得し、パースしていますが、エラーが発生しています。
ParserDelegator.parse(Unknown Source)
以下のコードを実行するとこのようなエラーが出てしまいます。エラー
を出さずにhtmlをパースしたいのですがどうすればよいでしょうか?
(httpが勝手にリンクされてしまうのでhを&x68;にしてあります)
置換してください。
java.lang.NullPointerException
at ParserTest$MyCallBack.handleText(ParserTest.java:78)
at javax.swing.text.html.parser.DocumentParser.handleText(Unknown Source)
at javax.swing.text.html.parser.Parser.handleText(Unknown Source)
at javax.swing.text.html.parser.Parser.endTag(Unknown Source)
at javax.swing.text.html.parser.Parser.parseTag(Unknown Source)
at javax.swing.text.html.parser.Parser.parseContent(Unknown Source)
at javax.swing.text.html.parser.Parser.parse(Unknown Source)
at javax.swing.text.html.parser.DocumentParser.parse(Unknown Source)
at javax.swing.text.html.parser.ParserDelegator.parse(Unknown Source)
at ParserTest.<init>(ParserTest.java:51)
at ParserTest.main(ParserTest.java:31)
以下ソース:
import java.io.*;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.parser.ParserDelegator;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTML;
import java.net.Socket;
import java.net.URL;
import java.net.SocketTimeoutException;
import java.io.*;
import java.nio.channels.*;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.regex.*;
import java.lang.StringBuffer;
import java.lang.Integer;
import java.lang.Math;
public class ParserTest{
/**
* 引数でHTMLファイルを指定
*/
public static void main(String[] args) throws IOException, FileNotFoundException{
new ParserTest(new URL("http://allabout.co.jp/internet/java/closeup/CU20060503A/index3.htm"),80);
}
public ParserTest(URL url,int mPort)throws IOException, FileNotFoundException{
Socket TSock = new Socket(url.getHost(), mPort);
TSock.setSoTimeout(3000);
BufferedWriter SockOut = new BufferedWriter(new OutputStreamWriter(TSock.getOutputStream()));
SockOut.write("GET " + url.getPath() + " HTTP/1.1\r\n");
SockOut.write("Host: " + url.getHost() + "\r\n");
SockOut.write("Connection: close\r\n\r\n");
SockOut.flush();
InputStream IS = TSock.getInputStream();
InputStreamReader ScISR = new InputStreamReader( IS );
ParserDelegator parser = new ParserDelegator();
MyCallBack mycallback = new MyCallBack();
parser.parse(ScISR, mycallback, true);
Enumeration e = mycallback.hrefs.keys();
while (e.hasMoreElements()){
String buff =new String((String)e.nextElement());
String Temp;
if(mycallback.hrefs.get(buff ).equals("小沢氏、民主公約修正に異議") ){
if(!buff.substring(0,6).equals("http://")){
Temp = "http://" + url.getHost() + buff;
}
System.out.println(buff + mycallback.hrefs.get(buff ) );
}
}
}
private static class MyCallBack extends HTMLEditorKit.ParserCallback{
public Hashtable<String,String> hrefs = new Hashtable<String,String>();
boolean f = false; String href="";
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos){
if (t.equals(HTML.Tag.A)){
href = (String)a.getAttribute(HTML.Attribute.HREF);
}
}
public void handleText(char[] data, int pos){
if(href.length() != 0){
//System.out.println(href);
hrefs.put(href, new String(data));
//System.out.println(new String(data));
}
}
public void handleEndTag(HTML.Tag t, int pos){
if (t.equals(HTML.Tag.TD)){
href = "";
}
}
}
}
お礼
ありがとうございます。 私エラーメッセージの見方が良くわかってませんでした。 そんな簡単な事だったのですね。nullかどうか確認するifを 入れたら回避する事ができました。 置換の件はすみませんでした。読みづらいコードを読んで いただいてありがとうございました。