2012-01-20 16 views
1

サンプルコード:テーブル行内の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") 

「私は、出力が「Fooのバー」のようなものになりたいか、大丈夫だと思う2つのライン間の実際の改行があった場合でも、私は得る出力はただ持っていますFooBar "、2行の間に空白がないことに注意してください。

非常にpythonとbeautifulsoupに新しい、誰かが手を与えることができますか?

答えて

3

cell = rows[0].find('td')を使用して1つ上のレベルに進み、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> 

その後、あなたは簡単に一部を抽出することができますあなたが必要です。

+0

をa rows {0} .find( 'td')。contents) 'を削除し、'
'タグを使用していますが、誰かがもう少しきれいな解決策を提供できることを願っています。これは美しいものの瑕疵であるか、何かが欠けているようです。 – Joseph

1

BeautifulSoupではなくlxmlを使用することをおすすめします。 lxmlは、を使って要素を検索することができます。これはBeautifulSoupのAPIを使用するよりも簡単です。 `プリント '' .join(STR(a)のために:私が行ってきた

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'