因此,我尝试使用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格式的数据....
答案 0 :(得分:2)
您遇到的问题是Content Negotiation问题。基本上,HTTP客户端可以要求服务器以特定格式获取内容(它使用Accept
标头),服务器可以通过以请求的格式发送内容(或者忽略请求和以任何想要的方式提供内容。
所以,你的问题不在于"转换"您收到的内容,但要让您的HTTP库只询问正确的格式。要执行此操作,只需添加具有以下值的http标头Accept
:application/atom+xml,application/rdf+xml,application/rss+xml,application/xml,text/xml
,您收到的内容应该是正确的。
此外,如果您想处理所有这些问题,请考虑使用像Superfeedr这样的API,它可以代表您进行轮询和解析,并向您发送规范化的JSON。