示例代码:
from BeautifulSoup import BeautifulSoup, SoupStrainer
html='''<tr>
<td align="left">Foo<br />
Bar<br /></td>
</tr>'''
soup=BeautifulSoup(html)
rows=soup.findAll('tr')
print rows
print rows[0].text.encode("utf8")
我希望输出类似于&#34; Foo Bar&#34;或者即使两条线之间有一条实际的换行线也没问题,但我得到的输出只有&#34; FooBar&#34;,请注意两条线之间没有空格。
对python和beautifulsoup来说很新,有人能伸出援手吗?
答案 0 :(得分:3)
您可以使用cell = rows[0].find('td')
更进一步,然后使用cell.contents
查看其内容,然后过滤所需的元素,然后按空格join
。
另一种选择:您可以使用正则表达式将<br />
替换为空格。为此你可以写:
import re
s = re.sub('<br\s*?>', ' ', rows[0].text)
然后你可以用
替换多个连续的空格s = re.sub('\s+', ' ', s)
然后字符串应如下所示:
>>> print s
<tr> <td align="left">Foo Bar </td> </tr>
然后您可以轻松提取所需的部分。
答案 1 :(得分:2)
您可能需要考虑使用lxml而不是BeautifulSoup。 lxml
使您能够使用XPath搜索元素(我认为)比使用BeautifulSoup的API更容易。
import lxml.html as LH
html='''<tr>
<td align="left">Foo<br />
Bar<br /></td>
</tr>'''
doc = LH.fromstring(html)
for tr in doc.xpath('//tr'):
print(repr(tr.text_content()))
产量
'Foo\nBar\n'
和
for text in doc.xpath('//tr/*/text()'):
print(repr(text))
产量
'Foo'
'\nBar'