【问题标题】:RSS Feed completely different to how displayed in BrowserRSS Feed 与浏览器中的显示方式完全不同
【发布时间】:2015-10-08 03:55:51
【问题描述】:

所以我正在尝试使用 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);

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

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

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

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

但是,如果我读取 url 并将其保存到文件中,它看起来与我在 URL 中看到的提要完全不同,并且包含大量 javascript,并且根本没有正常的 元素,不是甚至在 javascript 代码中。

dom4j 解析器讨厌我从 url 下载的提要,并抛出一系列时髦的异常,因为该页面是 .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 提要确实验证正确,所以必须可以从这个 url 获取 xml 格式的数据....

【问题讨论】:

  • 所以我发现 rss 提要的类型是:text/html、charset=UTF-8 而不是 text/xml、application/xml 或 application/rss+xml.... . 有人知道如何转换吗?

标签: javascript java wordpress xml-parsing rss


【解决方案1】:

您遇到的是Content Negotiation 问题。基本上,HTTP 客户端可以要求服务器以特定格式获取内容(它使用 Accept 标头),服务器可以通过以请求的格式发送内容来遵守(或者只是忽略请求并提供内容随心所欲)。

因此,您的问题不在于“转换”您收到的内容,而是让您的 HTTP 库只要求正确的格式。为此,只需添加具有以下值的 http 标头 Acceptapplication/atom+xml,application/rdf+xml,application/rss+xml,application/xml,text/xml,您将收到的内容应该是正确的。

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

【讨论】:

  • 您好 Julien,我已经尝试了您的建议,但它似乎仍然以相同的格式发回。我已经编辑了问题以包含新代码 - 我假设我做错了什么,因为可以将该 url 验证为 rss 提要....
猜你喜欢
  • 2013-02-03
  • 2016-07-02
  • 2013-03-24
  • 2012-08-10
  • 2014-10-08
  • 2015-04-06
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多