web-dev-qa-db-ja.com

BeautifulSoupのget_text()に関する提案

私はBeautifulSoupを使用してhtmlページのコンテンツを解析しています。

HTMLから必要なコンテンツ(つまり、spanmyclassによって定義されたclassに含まれるテキスト)を抽出できます。

result = mycontent.find(attrs={'class':'myclass'})

私はこの結果を得ます:

<span class="myclass">Lorem ipsum<br/>dolor sit amet,<br/>consectetur...</span>

以下を使用してテキストを抽出しようとすると、

result.get_text()

私が得る:

Lorem ipsumdolor sit amet,consectetur...

ご覧のとおり、タグ<br>が削除され、コンテンツ間にスペースがなくなり、2つの単語が連結されます。

この問題を解決するにはどうすればよいですか?

10
user601836

Bs4を使用している場合は、 strings を使用できます。

" ".join(result.strings)
22
Sean Vieira

'contents'を使用してから、<br>を置き換えますか?

これが完全な(動作し、テストされた)例です:

from bs4 import BeautifulSoup
import urllib2

url="http://www.floris.us/SO/bstest.html"
page=urllib2.urlopen(url)
soup = BeautifulSoup(page.read())

result = soup.find(attrs={'class':'myclass'})
print "The result of soup.find:"
print result

print "\nresult.contents:"
print result.contents
print "\nresult.get_text():"
print result.get_text()
for r in result:
  if (r.string is None):
    r.string = ' '

print "\nAfter replacing all the 'None' with ' ':"
print result.get_text()

結果:

The result of soup.find:
<span class="myclass">Lorem ipsum<br/>dolor sit amet,<br/>consectetur...</span>

result.contents:
[u'Lorem ipsum', <br/>, u'dolor sit amet,', <br/>, u'consectetur...']

result.get_text():
Lorem ipsumdolor sit amet,consectetur...

After replacing all the 'None' with ' ':
Lorem ipsum dolor sit amet, consectetur...

これはSeanの非常にコンパクトなソリューションよりも複雑ですが、可能な場合は指定した方針に沿ってソリューションを作成してテストすると言っていたので、約束を守ることにしました。ここで何が起こっているかが少しよくわかります。<br/>result.contentsタプル内の独自の要素ですが、文字列に変換すると「何も残っていません」。

13
Floris

result.get_text(separator=" ")は機能するはずです。

3
explorer