3

私はウェブページを解析するプログラムを書いています(私はアクセスできないのでそれを変更することはできません)。

まず、接続してgetContent()を使用して、ページのInputStreamを取得します。そこには問題はありません。

しかし、解析するとき:

    public static int[] parseMoveGameList(InputStream is) throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = dbf.newDocumentBuilder();
        Document doc = builder.parse(is);
        /*...*/
    }

ここでbuilder.parseはスローします:

org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 64; The system identifier must begin with either a single or double quote character.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:253)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:288)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
    at cs.ualberta.lgadapter.LGAdapter.parseMoveGameList(LGAdapter.java:78)
    ...

私が解析している(しかし変更できない)ページは次のようになります

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >









<html>
<head>
<META http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<!-- ...  -->
</head>
<body>
<!-- ...  -->
</body>
</html>

どうすればこの例外を乗り越えることができますか?

4

1 に答える 1

2

HTMLは有効なxmlではありません。xmlパーサーを使用してhtmlを解析すると、おそらく多くのエラーが発生します(すでに発見しているように)。

HTMLが失敗する理由は、Doctype宣言が原因です。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >

xmlパーサーは、「PUBLIC」Doctype宣言が次のようになることを想定しています。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "FALLBACK PATH TO DTD" >

HTMLページを変更できない場合、これについてできることがたくさんあるかどうかはわかりません。たぶん、入力ストリームを変更/ラップしてダミーデータを追加し、期待どおりにするか、Doctype宣言を削除することができます。

代わりに、HTML解析ライブラリを使用する必要があります。頭のてっぺんからは何も知りませんが、この(古い)投稿にはカップルがリストされているようです。http://www.benmccann.com/blog/java-html-parsing-library-comparison/。Googleの検索も http://jsoup.org/で戻ってきます

于 2012-08-10T17:07:34.750 に答える