【问题标题】:error while parsing rss feed for stackoverflow.com解析 stackoverflow.com 的 rss 提要时出错
【发布时间】:2013-09-15 16:34:52
【问题描述】:

我正在尝试创建解析所有支持提要的网站的 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 个结果。 搜索错误#2 有很多。都声明在任何网站 url 之前使用 http://

http://1up.com

但是错误仍然存​​在。我之前已经实现了这个,因为所有其他网站的 RSS 都被解析了。 这是我用于 1up.com RSS 提要的 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

【问题讨论】:

  • 当我点击此链接feeds.feedburner.com/1up/ALLPS3/content 时,谁能告诉我如何查看 1up.com 的 rss 文件,内容未以 xml 格式显示。如果无论如何我可以看一下xml,那么我什至可以尝试找出问题
  • 我想我发现了问题,网站 engadget.com 使用 并且我使用它自己进行了解析。但是像 stackoverflow.com 提要这样的网站有 。现在谁能告诉我如何停止使用 tag 解析提要?
  • 什么时候出现错误?当您尝试获取提要的链接或尝试解析原始提要时?
  • @z2s8 当我尝试获取 rss url 时,我使用日志消息来显示是否找到了链接。所以对于 1up.com 日志消息是“没有找到 rss 链接:1”,然后我得到了错误。但是对于 stackoverflow.com rss,它表示没有找到 rss 链接并且出现了错误。所以它的解析导致错误。但是engadget和1up.com的rss结构相同engadget.com/rss.xml1up.com/rss那么engadget的rss也被正确解析了
  • 在我看来,IllegalStateException: Target host must not be null, or set in parameters. 表示问题是由 invalid(或 null)RSS address 引起的。从 1up.com :<link rel="alternate" type="application/rss+xml" title="RSS" href="/rss?x=1" /> 和从您的 logcat 输出看来 request 到了错误的地址: rss?x=1 (或相同的 w/o http)所以而不是相对链接 1up.com/rss ,它将链接作为绝对链接处理。 您可以在解析提要之前检测相对链接并将其转换为绝对链接。

标签: android parsing rss


【解决方案1】:

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

http://1up.com:<link rel="alternate" type="application/rss+xml" title="RSS" href="/rss?x=1" /> 和从你的 logcat 输出看来 请求到了错误的地址: http:// rss?x=1 (or same w/o http) 所以改为在相对链接 1up.com/rss 中,它将链接作为绝对链接处理。
您可以在解析提要之前检测相对链接并将其转换为绝对链接。

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

【讨论】:

  • 嗨,感谢您的帮助,我已经为这两种类型的 rss 标准创建了解析器。现在一切正常!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2014-08-26
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多