我正在爬取一個網頁,並在抓取後從網頁中提取所有鏈接,然後我試圖使用Apache Tika和BoilerPipe通過使用下面的代碼解析所有URL解析得非常好,但對於少數XML我得到了以下錯誤。我不確定這個錯誤是什麼意思。我的代碼存在一些問題或XML文件存在一些問題?這是下面的行HTML Parser.java使用Apache Tika解析XML文件
String parsedText = tika.parseToString(htmlStream, md);
錯誤號100,我是,其具有
org.apache.tika.exception.TikaException: Invalid XML: Error on line 16: Invalid byte 1 of 1-byte UTF-8 sequence.
at org.apache.tika.parser.feed.FeedParser.parse(FeedParser.java:75)
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:197)
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:197)
at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:135)
at org.apache.tika.Tika.parseToString(Tika.java:357)
at edu.uci.ics.crawler4j.crawler.HTMLParser.parse(HTMLParser.java:101)
at edu.uci.ics.crawler4j.crawler.WebCrawler.handleHtml(WebCrawler.java:227)
at edu.uci.ics.crawler4j.crawler.WebCrawler.processPage(WebCrawler.java:299)
at edu.uci.ics.crawler4j.crawler.WebCrawler.run(WebCrawler.java:118)
at java.lang.Thread.run(Unknown Source)
HTMLParser.java代碼 -
public void parse(String htmlContent, String contextURL) {
InputStream htmlStream = null;
text = null;
title = null;
metaData = new HashMap<String, String>();
urls = new HashSet<String>();
char[] chars = htmlContent.toCharArray();
bulletParser.setCallback(textExtractor);
bulletParser.parse(chars);
try {
text = articleExtractor.getText(htmlContent);
} catch (BoilerpipeProcessingException e) {
e.printStackTrace();
}
if (text == null){
text = textExtractor.text.toString().trim();
}
title = textExtractor.title.toString().trim();
try {
Metadata md = new Metadata();
htmlStream = new ByteArrayInputStream(htmlContent.getBytes());
String parsedText = tika.parseToString(htmlStream, md);
//very unlikely to happen
if (text == null){
text = parsedText.trim();
}
processMetaData(md);
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(htmlStream);
}
bulletParser.setCallback(linkExtractor);
bulletParser.parse(chars);
Iterator<String> it = linkExtractor.urls.iterator();
String baseURL = linkExtractor.base();
if (baseURL != null) {
contextURL = baseURL;
}
int urlCount = 0;
while (it.hasNext()) {
String href = it.next();
href = href.trim();
if (href.length() == 0) {
continue;
}
String hrefWithoutProtocol = href.toLowerCase();
if (href.startsWith("http://")) {
hrefWithoutProtocol = href.substring(7);
}
if (hrefWithoutProtocol.indexOf("javascript:") < 0
&& hrefWithoutProtocol.indexOf("@") < 0) {
URL url = URLCanonicalizer.getCanonicalURL(href, contextURL);
if (url != null) {
urls.add(url.toExternalForm());
urlCount++;
if (urlCount > MAX_OUT_LINKS) {
break;
}
}
}
}
}
使用上面的代碼有什麼問題嗎?正如你所說的'這可能是一種黑客攻擊,你可能不想用它作爲你的最終解決方案。在我猜之後開始工作。 – ferhan
取決於你的用例。這迫使內容轉換爲UTF-8。也許內容是故意在其他編碼。如果tika期待UTF-8,這可能是答案,或者當你遇到不是UTF-8的內容時,你可能想拋出自己的異常。 –
感謝您的回答。我有一個問題,但有HTML文件解析問題,因爲一切(代碼)都是相同的。這是該鏈接[http://stackoverflow.com/questions/8319604/parsing-html-issues-with-apache-tika](http://stackoverflow.com/questions/8319604/parsing-html-issues-用的Apache-TIKA) – ferhan