2012 年 6 月の記事一覧です(2 件)

[Python]BeautifulSoup3からbeautifulsoup4へ変更した

先日、さくらVPSにインストールしてあるfeedparserのバージョンを上げたのですが、ついでにBeautifulSoupのバージョンを上げました。
BeautifulSoup4はBeautifulSoup3とは別モジュールになっているのでバージョンを上げるという言葉は語弊があるのかもしれません。

※これはOSXのPython2.6で実施したものですが実際にはUbuntu10.04 Python2.6で動いてます。
/Users/aoshiman% workon bs4
(bs4)/Users/aoshiman% pip install beautifulsoup4 
Downloading/unpacking beautifulsoup4
Downloading beautifulsoup4-4.1.0.tar.gz (128Kb): 128Kb downloaded
Running setup.py egg_info for package beautifulsoup4
Installing collected packages: beautifulsoup4
Running setup.py install for beautifulsoup4
Successfully installed beautifulsoup4
Cleaning up...
(bs4)/Users/aoshiman% pip freeze
beautifulsoup4==4.1.0
現時点では4.1.0がインストールされました。

とりあえず使ってみます。
(bs4)/Users/aoshiman% python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import BeautifulSoup
Traceback (most recent call last):
  File "", line 1, in 
ImportError: No module named BeautifulSoup
>>> 
早速エラーです(>_<)

>>> from bs4 import BeautifulSoup
これでOKです。

このブログにアクセスして要素を取得してみます。
>>> from bs4 import BeautifulSoup
>>> import urllib2
>>> soup = BeautifulSoup(urllib2.urlopen('http://blog.aoshiman.org/'))
>>> soup.title
<title>aoshiman.org</title>
>>> soup.title.string
u'aoshiman.org'
>>> soup.title.parent.name
u'head'
>>> 

BeautifulSoup3とBeautifulSoup4の違いはドキュメントにしっかり書いてあります

ドキュメントによると幾つかのメソッド名変更があるとのこと。よく使うfindAllなんかはfind_allへ
>>> soup.find_all('p')
[<p>Hello! I'm aoshiman. Please contact me using these services!</p>]

findAllだと
>>> soup.findAll('p')
[<p>Hello! I'm aoshiman. Please contact me using these services!</p>]
>>> 
あれっ?取れた
ソースコードの該当しそうな箇所みたらfindAllも使えるようです(2012/6/19現在)。

[Python]feedparserのバージョンを上げたらハマったという話

先日、さくらVPSのプランをメモリ2Gのプランに変更したので、引越し作業をしたのですが、使用しているfeedparserのバージョンを最新にしたらエラーが出てしまいました。
まずはバージョンが5.0.1の場合、

/Users/aoshiman% workon old_feedparser
(old_feedparser)/Users/aoshiman% pip freeze           
feedparser==5.0.1
(old_feedparser)/Users/aoshiman% python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import feedparser
>>> feed = feedparser.parse('http://keiba.radionikkei.jp/keiba/rss2/news/')
>>> for i in feed.entries:
...     print i.date
... 
Sat, 16 Jun 2012 08:11:18 +0000
Sat, 16 Jun 2012 08:09:06 +0000
Sat, 16 Jun 2012 08:00:14 +0000
Sat, 16 Jun 2012 07:50:20 +0000
Sat, 16 Jun 2012 07:49:55 +0000
Sat, 16 Jun 2012 07:49:17 +0000
Sat, 16 Jun 2012 07:27:45 +0000
Sat, 16 Jun 2012 07:20:56 +0000
Sat, 16 Jun 2012 07:12:11 +0000
Sat, 16 Jun 2012 07:06:18 +0000
>>> 
このように日付が取得出来ますが、これが5.1.2の場合、

(old_feedparser)/Users/aoshiman% deactivate 
/Users/aoshiman% workon new_feedparser 
(new_feedparser)/Users/aoshiman% pip freeze           
feedparser==5.1.2
(new_feedparser)/Users/aoshiman% python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import feedparser
>>> feed = feedparser.parse('http://keiba.radionikkei.jp/keiba/rss2/news/')
>>> for i in feed.entries:
...     print i.date
... 
Traceback (most recent call last):
  File "", line 2, in 
  File "/users/aoshiman/.virtualenvs/new_feedparser/lib/python2.6/site-packages/feedparser.py", line 424, in __getattr__
    raise AttributeError, "object has no attribute '%s'" % key
AttributeError: object has no attribute 'date'
>>> 

このようにdateなんて知らないよーって出ます。

色々調べたところ、この現象はfeedparserのIssueに掲載されていました
Issue 340 - feedparser - "date" attribute not in 5.1.1 - Parse Atom and RSS feeds in Python - Google Project Hosting
要は、もうentries.dateでは要素にはアクセス出来ませんよ、entries.publishedを使って下さいとのことのようです。

>>> import feedparser
>>> feed = feedparser.parse('http://keiba.radionikkei.jp/keiba/rss2/news/')
>>> for i in feed.entries:
...     print i.published
... 
Sat, 16 Jun 2012 08:11:18 +0000
Sat, 16 Jun 2012 08:09:06 +0000
Sat, 16 Jun 2012 08:00:14 +0000
Sat, 16 Jun 2012 07:50:20 +0000
Sat, 16 Jun 2012 07:49:55 +0000
Sat, 16 Jun 2012 07:49:17 +0000
Sat, 16 Jun 2012 07:27:45 +0000
Sat, 16 Jun 2012 07:20:56 +0000
Sat, 16 Jun 2012 07:12:11 +0000
Sat, 16 Jun 2012 07:06:18 +0000
>>> 

PAGE TOP