Адаптировано из коллективного интеллекта Тони Сегарана (стр. 60):
def gettextonly(soup):
v=soup.string
if v == None:
c=soup.contents
resulttext=''
for t in c:
subtext=gettextonly(t)
resulttext+=subtext+'\n'
return resulttext
else:
return v.strip()
Пример использования:
>>>from BeautifulSoup import BeautifulSoup
>>>doc = ['<html><head><title>Page title</title></head>',
'<body><p id="firstpara" align="center">This is paragraph <b>one</b>.',
'<p id="secondpara" align="blah">This is paragraph <b>two</b>.',
'</html>']
>>>''.join(doc)
'<html><head><title>Page title</title></head><body><p id="firstpara" align="center">
This is paragraph <b>one</b>.<p id="secondpara" align="blah">This is
paragraph<b>two</b>.</html>'
>>>soup = BeautifulSoup(''.join(doc))
>>>gettextonly(soup)
u'Page title\n\nThis is paragraph\none\n.\n\nThis is paragraph\ntwo\n.\n\n\n\n'
Обратите внимание, что в результате получается одна строка, в которой текст изнутри отличаетсятеги, разделенные символами новой строки (\ n).
Если вы хотите извлечь все слова текста в виде списка слов, вы можете использовать следующую функцию, также адаптированную из Tony Segaran's Programming Collective Intelligence.(стр. 61):
import re
def separatewords(text):
splitter=re.compile('\\W*')
return [s.lower() for s in splitter.split(text) if s!='']
Пример использования:
>>>separatewords(gettextonly(soup))
[u'page', u'title', u'this', u'is', u'paragraph', u'one', u'this', u'is',
u'paragraph', u'two']