我正在编写一个解析网页的程序(我无权访问该网页,因此我无法对其进行修改)。
首先,我连接并使用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>
如何通过此例外?
答案 0 :(得分: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/