Hatena::Grouppython

yanbe.py このページをアンテナに追加 RSSフィード

2008-10-25

BeautifulSoupでタグを除去してテキストだけ抜き出す

13:53 |  BeautifulSoupでタグを除去してテキストだけ抜き出す - yanbe.py を含むブックマーク はてなブックマーク -  BeautifulSoupでタグを除去してテキストだけ抜き出す - yanbe.py  BeautifulSoupでタグを除去してテキストだけ抜き出す - yanbe.py のブックマークコメント

BeautifulSoupデビュー - When it’s ready.より.

import urllib2

from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup(urllib2.urlopen('http://www.hatena.ne.jp/'))
text = '\n'.join([e.string for e in soup.findAll() 
                  if e.string!=None and e.name not in ('script','style')])

10/28 21:48 追記

e.string==e.contents[0]なので,上記のコードだと以下のような例でテキストの取りこぼしが発生することが,コメント欄の通りすがりさんのご指摘により判明しました.

pTag = soup.p
pTag.contents
# [u'This is paragraph ', <b>one</b>, u'.']
pTag.contents[1].contents
# [u'one']
pTag.contents[0].contents
# AttributeError: 'NavigableString' object has no attribute 'contents'

これだけ短いという事は他になにかが消えてるって事か。

Pythonでスクレイピングに最適なライブラリはlxmlな気がした。時間的な意味で - When it’s ready.

これはこのせいですね..すみません.

その他いくつかの問題を修正した修正版は以下.

import urllib2
from BeautifulSoup import BeautifulSoup, NavigableString, Declaration, Comment

def getNavigableStrings(soup):
  if isinstance(soup, NavigableString):
    if type(soup) not in (Comment, Declaration) and soup.strip():
      yield soup
  elif soup.name not in ('script', 'style'):
    for c in soup.contents:
      for g in getNavigableStrings(c):
        yield g

soup = BeautifulSoup(urllib2.urlopen('http://www.hatena.ne.jp/'),
    convertEntities="html")

text = '\n'.join(getNavigableStrings(soup))
print text

通りすがり通りすがり2008/10/28 19:28http://www.crummy.com/software/BeautifulSoup/documentation.html#string