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

RSS Feed completely different to how displayed in Browser

所以我正在尝试使用 dom4j 以编程方式解析 Java 中播客的 RSS 提要。

代码是这样的,而且运行很顺利的很多提要:

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!供稿的 url 是:https://marxismtodaypodcast.wordpress.com/category/audio/feed/

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

甚至这个提要验证器也确认它是格式正确的提要:

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

但是,如果我在 url 中阅读并将其保存到文件中,它看起来与我在 URL 中看到的提要完全不同,并且包含大量 javascript , 和 none 的普通 < item > 元素,甚至在 javascript 代码中也不行。

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

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

或者我完全找错了树,还有其他事情发生了吗?

编辑 1:尝试在 HTTP Header

中接受 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 提要确实正确验证,因此必须可以从此 url...

获取 xml 格式的数据

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

因此,您的问题不在于 "convert" 您收到的内容,而是让您的 HTTP 库仅请求正确的格式。为此,只需添加具有以下值的 http header Acceptapplication/atom+xml,application/rdf+xml,application/rss+xml,application/xml,text/xml 并且您将收到的内容应该是正确的。

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