YCombinator 很好地提供了一个RSS 提要和一个包含HackerNews上热门项目的大型 RSS 提要。我正在尝试编写一个 python 脚本来访问 RSS 提要文档,然后使用 BeautifulSoup 解析出某些信息。但是,当 BeautifulSoup 尝试获取每个项目的内容时,我会遇到一些奇怪的行为。
以下是 RSS 提要的一些示例行:
<rss version="2.0">
<channel>
<title>Hacker News</title><link>http://news.ycombinator.com/</link><description>Links for the intellectually curious, ranked by readers.</description>
<item>
<title>EFF Patent Project Gets Half-Million-Dollar Boost from Mark Cuban and 'Notch'</title>
<link>https://www.eff.org/press/releases/eff-patent-project-gets-half-million-dollar-boost-mark-cuban-and-notch</link>
<comments>http://news.ycombinator.com/item?id=4944322</comments>
<description><![CDATA[<a href="http://news.ycombinator.com/item?id=4944322">Comments</a>]]></description>
</item>
<item>
<title>Two Billion Pixel Photo of Mount Everest (can you find the climbers?)</title>
<link>https://s3.amazonaws.com/Gigapans/EBC_Pumori_050112_8bit_FLAT/EBC_Pumori_050112_8bit_FLAT.html</link>
<comments>http://news.ycombinator.com/item?id=4943361</comments>
<description><![CDATA[<a href="http://news.ycombinator.com/item?id=4943361">Comments</a>]]></description>
</item>
...
</channel>
</rss>
这是我编写的(在 python 中)访问此提要并为每个项目打印出title
、link
和的代码:comments
import sys
import requests
from bs4 import BeautifulSoup
request = requests.get('http://news.ycombinator.com/rss')
soup = BeautifulSoup(request.text)
items = soup.find_all('item')
for item in items:
title = item.find('title').text
link = item.find('link').text
comments = item.find('comments').text
print title + ' - ' + link + ' - ' + comments
但是,此脚本给出的输出如下所示:
EFF Patent Project Gets Half-Million-Dollar Boost from Mark Cuban and 'Notch' - - http://news.ycombinator.com/item?id=4944322
Two Billion Pixel Photo of Mount Everest (can you find the climbers?) - - http://news.ycombinator.com/item?id=4943361
...
如您所见,中间的link
, 不知何故被省略了。也就是说,结果值link
不知何故是一个空字符串。那为什么呢?
当我深入研究其中的内容时soup
,我意识到它在解析 XML 时会莫名其妙地窒息。这可以通过查看中的第一项来看出items
:
>>> print items[0]
<item><title>EFF Patent Project Gets Half-Million-Dollar Boost from Mark Cuban and 'Notch'</title></link>https://www.eff.org/press/releases/eff-patent-project-gets-half-million-dollar-boost-mark-cuban-and-notch<comments>http://news.ycombinator.com/item?id=4944322</comments><description>...</description></item>
您会注意到仅使用link
标签就发生了一些奇怪的事情。它只是获取关闭标签,然后是该标签的文本。这是一些非常奇怪的行为,特别是与title
没有comments
问题的解析相比。
这似乎是 BeautifulSoup 的问题,因为请求实际读取的内容没有任何问题。我不认为它仅限于 BeautifulSoup,因为我也尝试使用 xml.etree.ElementTree API 并且出现了同样的问题(BeautifulSoup 是基于这个 API 构建的吗?)。
有谁知道为什么会发生这种情况,或者我如何仍然可以使用 BeautifulSoup 而不会出现此错误?
注意:我终于能够使用 xml.dom.minidom 获得我想要的东西,但这似乎不是一个强烈推荐的库。如果可能的话,我想继续使用 BeautifulSoup。
更新:我在使用 Python 2.7.2 和 BS4 4.1.3 的 OSX 10.8 的 Mac 上。
更新 2:我有 lxml,它是用 pip 安装的。它是 3.0.2 版。至于 libxml,我检查了 /usr/lib,显示的是 libxml2.2.dylib。不确定何时或如何安装。