解析stackoverflow.com的rss feed时出错

时间:2013-09-15 16:34:53

标签: android parsing rss

我正在尝试创建rss供稿应用,解析所有支持供稿的网站。我为此目的使用了Jsoup。并以这种方式解析不同类型的rss

org.jsoup.select.Elements links = doc.select("link[type=application/rss+xml]");  
org.jsoup.select.Elements links = doc.select("link[type=application/atom+xml]");

它解析了各种网站,如engadget.com,ndtv.com等,但当我尝试使用stackoverflow.com或1up.com这样的网站时,我收到了以下错误。

  

线程以未捕获的异常退出(group = 0x40efe378)

Caused by: java.lang.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, path=/rss

搜索错误#1甚至没有产生1个结果。 寻找eroror#2有很多。所有声明在任何网站url之前使用http://

http://1up.com

但是错误仍然存​​在。我已经实现了这个,因为所有其他网站的rss都被解析了。 这是我用于1up.com rss feed的logcat。

D/URL Length(4097): 14
D/url name(4097): http://1up.com
D/No of RSS links found(4097):  1
W/dalvikvm(4097): threadid=12: thread exiting with uncaught exception (group=0x40efe378)
E/AndroidRuntime(4097): FATAL EXCEPTION: AsyncTask #1
E/AndroidRuntime(4097): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime(4097):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
E/AndroidRuntime(4097):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
E/AndroidRuntime(4097):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
E/AndroidRuntime(4097):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
E/AndroidRuntime(4097):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
E/AndroidRuntime(4097):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
E/AndroidRuntime(4097):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
E/AndroidRuntime(4097):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
E/AndroidRuntime(4097):     at java.lang.Thread.run(Thread.java:856)
E/AndroidRuntime(4097): Caused by: java.lang.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, path=/rss
E/AndroidRuntime(4097):     at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:591)
E/AndroidRuntime(4097):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:293)
E/AndroidRuntime(4097):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
E/AndroidRuntime(4097):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
E/AndroidRuntime(4097):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
E/AndroidRuntime(4097):     at com.maulik.rss.RssParser.getXmlFromUrl(RssParser.java:214)
E/AndroidRuntime(4097):     at com.maulik.rss.RssParser.getRSSFeed(RssParser.java:69)
E/AndroidRuntime(4097):     at com.maulik.rss.RSS_AddNewSiteActivity$loadRSSFeed.doInBackground(RSS_AddNewSiteActivity.java:97)
E/AndroidRuntime(4097):     at com.maulik.rss.RSS_AddNewSiteActivity$loadRSSFeed.doInBackground(RSS_AddNewSiteActivity.java:1)
E/AndroidRuntime(4097):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
E/AndroidRuntime(4097):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
E/AndroidRuntime(4097):     ... 5 more

1 个答案:

答案 0 :(得分:1)

IllegalStateException: Target host must not be null, or set in parameters.表示问题是由无效(或null)RSS 地址引起的。

http://1up.com<link rel="alternate" type="application/rss+xml" title="RSS" href="/rss?x=1" />和您的logcat输出似乎请求转到了错误的地址:http:// rss?x = 1(或相同的w / o http)所以它不是相对链接1up.com/rss,而是将链接作为绝对链接处理。
您可以在解析Feed之前检测相对链接并将其转换为绝对链接。

虽然有些网站使用RSS标准,但有些网站使用Atom标准。 RSS和Atom Feed'tags are different
您可能需要为每种Feed类型创建不同的解析算法。