Android Studio有一个非常不寻常的问题,它在4天前开始(我假设在更新后)。 问题是:尝试读取(解析)任何页面时会抛出异常,无论是维基百科,谷歌,雅虎,某些java文档......,但是当我在Eclipse中编写相同的代码时,一切都运行正常。 所以,这是来自调用类(活动)的代码:
`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();
}
}
Android Studio中的异常从代码中抛出:
Document doc = db.parse(https.getInputSteam())
Eclipse执行的结果如下所示:
//upload.wikimedia.org/wikipedia/en/thumb/4/4d/BatmanComicIssue1%2C1940.png/250px-BatmanComicIssue1%2C1940.png
来自Android Studio:
`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$2.call(AsyncTask.java:288)
System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
System.err: at android.os.AsyncTask$SerialExecutor$1.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)`
我会感谢能够对这个非理性问题给出理性意见的人!!!
答案 0 :(得分:1)
HTML!= XML
XML解析器对输入语法非常严格。另一方面,Web浏览器必须与不匹配的标签等竞争并且更加宽容。因此,尝试使用XML解析器解析网页将是一场失败的战斗。
即使Google在Android中也存在同样的问题。如果您查看将Html.fromHtml()
转换为标记SpannableString
的{{1}}源代码,您会发现它们使用名为jsoup的开源库。这允许&#34; tag-soup&#34;要像XML一样解析的HTML。它将通过真正破碎的HTML标记为您创建一个合理的DOM。我建议你看看你的应用程序的jsoup。