YCombinator は、RSS フィードと、HackerNews のトップ アイテムを含む大きな RSS フィードを提供するのに十分です。RSS フィード ドキュメントにアクセスし、BeautifulSoup を使用して特定の情報を解析するための Python スクリプトを作成しようとしています。ただし、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>
これは、このフィードにアクセスして各項目のtitle
、link
、およびを出力するために (Python で) 書いたコードです。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
はどういうわけか空の文字列です。では、それはなぜでしょうか。
の内容を調べてみると、XML を解析するときに何かがsoup
詰まっていることに気付きました。これは、 の最初の項目を見るとわかります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 の問題のようです。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 です。それがいつ、どのようにインストールされたのかはわかりません。