読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

BeautifulSoup.pyを使ってみた

Python

スポンサードリンク

scrapyを使っていたけど
なーかなかなかなか、これが難しいのなんの。


そして、フレームワークなのに
ドキュメントが全部英語!!!(;ω;)
※英語読めない、隊長が悪いけど


どうしても処理の中で、scrapyが取得したURLリンクを使って
別ページを同時処理にてクロールしたかったんだけど
うまくいかなくて、もう途中で別途クロールすればいいんじゃね?と思いました。


そこでであったのがこの「BeatifulSoup」
サードパーティらしいけど、結構使いやすそうなので使ってみた。

サイトからとってきます

$ curl 'http://www.crummy.com/software/BeautifulSoup/bs3/download//3.x/BeautifulSoup-3.2.1.tar.gz' >BeautifulSoup.tar.gz
$ tar zxvf BeautifulSoup.tar.gz 

テストしてみます。

$ python BeautifulSoup-3.2.1/BeautifulSoupTests.py 
....................................................................
----------------------------------------------------------------------
Ran 68 tests in 0.153s

OK

(`・ω・)b

使ってみる

# ここは任意で
from mylib.BeautifulSoup import BeautifulSoup

# Yahooのサイトを使います。
link = '/index.html'
link_data = urllib.urlopen('http://www.yahoo.co.jp' + link)

# BeatifulSoup()で、エレメント(?)化
soup = BeautifulSoup(link_data)
# find()で、ulセレクターの'id=siteinfo' の箇所を取得
tag_lists = soup.find('ul', attrs = {'id' : 'siteinfo'})
tag_item = []

# findAll()で、liセレクター毎にリスト化
for tag_list in tag_lists.findAll('li'):

	# stringへ変更
	tag_list = str(tag_list)

	if tag_list.startswith('<li><a href="'):
		# 前回の記事で発狂しそうだったところ
		tag_link = re.sub('.*\"(.+?)\".*', '\\1', tag_list)
		tag_text = re.sub('<li><a.+?>(.+?)<.*$', '\\1', tag_list)
		# TagItem() -> scrapy/items.py に記述された Feild()
		# TagItem() - tag_link()
		#           - tag_text()
		tag_item = TagItem()
		tag_item['tag_link'] = tag_link
		tag_item['tag_text'] = tag_text

return tag_item

これで、scrapyと併用にスクレイピングができた。


実はこのアイディア(?)は、Githubで外国人のリポジトリ
ずぅーーーっとにらめっこをして、探しだしました。


ありがとう!
そして、英語を勉強したほうが近道じゃないかな?と
最近思いはじめた隊長でした。