RSS提要完全不同于浏览器中显示的方式

RSS Feed completely different to how displayed in Browser

本文关键字:显示 方式 浏览器 不同于 RSS      更新时间:2023-09-26

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

代码是这样的,并且对于很多很多提要都能顺利运行:

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);

然后我遇到了一个问题提要!提要的url是:https://marxismtodaypodcast.wordpress.com/category/audio/feed/

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

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

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

然而,如果我读取url,并将其保存到一个文件中,它看起来不像我在url中看到的提要,并且包含javascript加载,而没有正常的<</p>

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

我怀疑页面中的javascript以某种方式创建了我们在浏览器中看到的输出。有没有办法让我下载我们在浏览器中看到的东西,而不是原始的javascript文件?我想这样做的方式,可以自动化,所以不太黑客!

或者也许我完全搞错了,还有别的事情发生吗?

EDIT 1: failed to Accept XML in HTTP Header

所以我尝试让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格式的数据。

你遇到的是一个内容协商问题。基本上,HTTP客户端可以要求服务器以特定格式获取内容(它使用Accept标头),服务器可以按照请求的格式发送内容(或者只是忽略请求,以它想要的任何格式提供内容)。

所以,你的问题不是"转换"你收到的内容,而是让你的HTTP库只要求正确的格式。要做到这一点,只需添加一个http头Accept与以下值:application/atom+xml,application/rdf+xml,application/rss+xml,application/xml,text/xml,您将收到的内容应该是正确的。

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