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 Accept
:application/atom+xml,application/rdf+xml,application/rss+xml,application/xml,text/xml
并且您将收到的内容应该是正确的。
此外,如果您想处理所有这些问题,请考虑使用像 Superfeedr 这样的 API,它可以代表您进行轮询和解析,然后只向您发送规范化的 JSON.
所以我正在尝试使用 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 Accept
:application/atom+xml,application/rdf+xml,application/rss+xml,application/xml,text/xml
并且您将收到的内容应该是正确的。
此外,如果您想处理所有这些问题,请考虑使用像 Superfeedr 这样的 API,它可以代表您进行轮询和解析,然后只向您发送规范化的 JSON.