Android Studio - 访问维基百科页面时出现 SAXParseException

Android Studio - SAXParseException when accessing wikipedia page

我在 Android Studio 中遇到了一个非常不寻常的问题,该问题是 4 天前开始的(我假设是在更新后)。 问题是:尝试读取(解析)任何页面时抛出异常,无论是维基百科、google、雅虎、一些 java 文档...,但是当我在中编写相同的代码时Eclipse,一切正常。 因此,这是调用 class (activity) 的代码:

    `new Thread(new ImgCrawlerThread("https://en.wikipedia.org/wiki/Batman_(comic_book)")).start();`

这是来自 ImgCrawlerThread 的代码:

    public void run() {
    // TODO Auto-generated method stub
    try {
        //Thread.sleep(60000);
        URL url = new URL(httpsurl);
        HttpsURLConnection https = (HttpsURLConnection)url.openConnection();
        DocumentBuilder db;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        db = dbf.newDocumentBuilder();
        Document doc = db.parse(https.getInputStream());
        NodeList nodes = doc.getElementsByTagName("img");
        System.out.println(nodes.item(0).getAttributes().getNamedItem("src").getNodeValue());
        https.disconnect();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

AndroidStudio 中的异常是从代码中抛出的: Document doc = db.parse(https.getInputSteam())

Eclipse 执行的结果如下所示:

//upload.wikimedia.org/wikipedia/en/thumb/4/4d/BatmanComicIssue1%2C1940.png/250px-BatmanComicIssue1%2C1940.png

来自 Android 工作室:

     `org.xml.sax.SAXParseException: expected: /img read: a (position:END_TAG </a>@43:317 in java.io.InputStreamReader@1f213bb3) 
System.err:     at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146)
System.err:     at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
System.err:     at com.finki.filip.crawlingtest.CrawlerAsync.doInBackground(CrawlerAsync.java:61)
System.err:     at com.finki.filip.crawlingtest.CrawlerAsync.doInBackground(CrawlerAsync.java:37)
System.err:     at android.os.AsyncTask.call(AsyncTask.java:288)
System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
System.err:     at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
System.err:     at java.lang.Thread.run(Thread.java:818)`

如果有人能就这个不合理的问题给我一个合理的意见,我将不胜感激!!!

HTML != XML

XML 解析器对输入语法非常严格。另一方面,Web 浏览器必须应对不匹配的标签等,并且更加宽容。因此,尝试使用 XML 解析器解析网页将是一场失败的战斗。

甚至Google在Android里面也有同样的问题。如果您查看 Html.fromHtml() 的源代码,它将 HTML 转换为他们标记的 SpannableString,您会发现他们使用了一个名为 jsoup 的开源库。这允许 "tag-soup" HTML 像 XML 一样被解析。它会从真正损坏的 HTML 标记中为您创建一个合理的 DOM。我建议您为您的应用程序查看 jsoup。