RSS Feed与浏览器中显示的方式完全不同

时间:2015-07-18 15:15:28

标签: javascript java wordpress xml-parsing rss

因此,我尝试使用dom4j以编程方式为Java中的播客解析RSS源。

代码就像这样,并且可以顺畅地运行大量的Feed:

BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));

String line;

while((line = reader.readLine()) != null)
{
    this.xmlData += line + "\n";
}
reader.close();

PrintWriter writer = new PrintWriter("rss_feed.txt", "UTF-8");
writer.println(this.xmlData);
writer.close();

this.document = DocumentHelper.parseText(this.xmlData);

然后我遇到问题Feed! Feed的网址为:https://marxismtodaypodcast.wordpress.com/category/audio/feed/

现在奇怪的是,如果我在浏览器中查看此页面,它看起来像一个普通的RSS源,充满了预期的元素。

即使此Feed验证程序确认它是格式正确的Feed:

https://validator.w3.org/feed/

但是,如果我在网址中读取并将其保存到文件中,它看起来就像我在网址中看到的提要,并且包含大量的javascript,而且没有正常的< item>元素,甚至不是javascript代码。

dom4j解析器讨厌我从url下载的feed,并抛出一系列时髦的异常,因为页面是.html页面而不是xml页面。

我怀疑页面中的javascript是以某种方式创建我们在浏览器中看到的输出。有什么方法可以下载我们在浏览器中看到的而不是原始的javascript文件?我想以一种可自动化的方式做到这一点,所以不要太苛刻!

或者我可能完全咆哮错误的树,还有其他事情在发生吗?

编辑1:尝试在HTTP标头中接受XML

所以我试图让HttpURLConnection接受xml,正如评论者Julien Genestoux所建议的那样。这是我试过的代码:

HttpURLConnection connection = (HttpURLConnection)feed.openConnection();
connection.setRequestProperty("Accept","application/atom+xml,application/rdf+xml,application/rss+xml,application/xml,text/xml");
connection.connect();
String content_type = connection.getContentType();
System.out.println("content = " + content_type);

然而,当我运行这个时,我得到了相同的数据,内容为:

text/html; charset=UTF-8

我是否正确编码?我认为我有一些错误,因为这个RSS提要确实正确验证,所以必须可以从这个网址获取xml格式的数据....

1 个答案:

答案 0 :(得分:2)

您遇到的问题是Content Negotiation问题。基本上,HTTP客户端可以要求服务器以特定格式获取内容(它使用Accept标头),服务器可以通过以请求的格式发送内容(或者忽略请求和以任何想要的方式提供内容。

所以,你的问题不在于"转换"您收到的内容,但要让您的HTTP库只询问正确的格式。要执行此操作,只需添加具有以下值的http标头Acceptapplication/atom+xml,application/rdf+xml,application/rss+xml,application/xml,text/xml,您收到的内容应该是正确的。

此外,如果您想处理所有这些问题,请考虑使用像Superfeedr这样的API,它可以代表您进行轮询和解析,并向您发送规范化的JSON。

相关问题