【问题标题】:Python/Feedparser: reading RSS feed failsPython/Feedparser:读取 RSS 提要失败
【发布时间】:2015-07-29 10:29:57
【问题描述】:

我正在使用feedparser 来获取 RSS 提要数据。对于大多数工作正常的 RSS 提要。但是,我知道偶然发现了一个获取 RSS 提要失败的网站 (example feed)。返回结果不包含预期的键,值是一些 HTML 代码。

我尝试使用 urllib2.Request(url) 简单地读取提要 URL。这将失败并出现HTTP Error 405: Not Allowed 错误。如果我添加一个自定义标题,例如

headers = {
    'Content-type' : 'text/xml',
    'User-Agent': 'Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0',
}

request = urllib2.Request(url)

我不再收到 405 错误,但返回的内容是一个带有一些 HEAD 标记和一个基本上为空的 BODY 的 HTML 文档。在浏览器中一切看起来都很好,当我查看“查看页面源代码”时也是如此。 feedparser.parse 也允许设置agentrequest_headers,我尝试了各种代理。我仍然无法正确读取 XML,更不用说来自 feedparse 的解析提要了。

我在这里错过了什么?

【问题讨论】:

  • @JulienGenestoux:原来是通过 Javascript 动态创建 RSS 提要——这是我第一次遇到这种情况。你的系统能处理这个吗。我目前有一种使用 PhantomJS 的工作解决方案。基于此,我可能会尽快提供答案。
  • 不,他们不通过 JS 生成提要 :)(我什至不确定这是否可能!)。请参阅下面的答案......是的,Superfeedr 能够很好地处理这个问题!

标签: python rss urllib2 feed feedparser


【解决方案1】:

因此,当发出请求的客户端未使用 User-Agent 时,此提要会产生 405 错误。试试这个:

$ curl 'http://www.propertyguru.com.sg/rss' -H 'User-Agent: hum' -o /dev/null -D- -s
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 21 May 2015 15:48:44 GMT
Content-Type: application/xml; charset=utf-8
Content-Length: 24616
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Vary: Accept-Encoding

在没有 UA 的情况下,您会得到:

$ curl 'http://www.propertyguru.com.sg/rss' -o /dev/null -D- -s
HTTP/1.1 405 Not Allowed
Server: nginx
Date: Thu, 21 May 2015 15:49:20 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Vary: Accept-Encoding

【讨论】:

  • 正如我在问题中所写,我通过设置标题解决了 405 错误。但是,无论是使用 cURL 还是使用 Python 请求,我都不会像我期望的那样从 RSS 提要中获得 XML 文档。只有一些几乎是空的 HTML 文档。你能发布实际输出 XML 的 cURL 吗?
  • 我就是这么做的! (删除 -o /dev/null)你会看到完整的 XML!
  • 呃,对我不起作用。如果我这样做curl 'http://www.propertyguru.com.sg/rss' -H 'User-Agent: hum' -D- -s,我会得到最小的 HTML 文档,正文为<body><div id="distil_ident_block"> </div></body>
猜你喜欢
  • 2023-01-27
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多