关于BeautifulSoup中get_text()的建议

use*_*836 10 python beautifulsoup

我正在使用BeautifulSoup来解析html页面中的一些内容.

我可以从html中提取我想要的内容(即包含在myclass中span定义的文本class).

result = mycontent.find(attrs={'class':'myclass'})
Run Code Online (Sandbox Code Playgroud)

我得到了这个结果:

<span class="myclass">Lorem ipsum<br/>dolor sit amet,<br/>consectetur...</span>
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用以下方法提取文本:

result.get_text()
Run Code Online (Sandbox Code Playgroud)

我获得:

Lorem ipsumdolor sit amet,consectetur...
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当标签<br>被移除时,内容之间没有更多的间距,并且两个单词被合并.

我该如何解决这个问题?

Sea*_*ira 22

如果您使用的是bs4,您可以使用strings:

" ".join(result.strings)
Run Code Online (Sandbox Code Playgroud)

  • 或者使用kwarg分隔符,它在get_text中执行相同的操作:result.get_text('separator ='"") - >'Lorem ipsum dolor sit amet,consectetur ......' (7认同)

Flo*_*ris 13

使用'内容',然后替换<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()
Run Code Online (Sandbox Code Playgroud)

结果:

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...
Run Code Online (Sandbox Code Playgroud)

这比Sean非常紧凑的解决方案更精细 - 但是因为我曾经说过我会创建并测试我能够指示的解决方案,我决定遵循我的承诺.你可以看到这里发生了什么 - 它<br/>result.contents元组中它自己的元素,但是当转换为字符串时,"没有任何东西".


exp*_*rer 6

result.get_text(separator=" ")应该管用。