表格中的BeautifulSoup和换行符?

时间:2012-01-20 07:12:31

标签: python html-parsing beautifulsoup

示例代码:

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来说很新,有人能伸出援手吗?

2 个答案:

答案 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'