2012-01-20 5 views
1

Exemple de code:BeautifulSoup et saut de ligne dans une ligne de table?

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") 

Je voudrais que la sortie soit quelque chose comme « Foo Bar » ou même s'il y avait un retour à la ligne réelle entre les deux lignes qui seraient très bien, mais la sortie que je viens d'obtenir a " FooBar ", notez qu'il n'y a pas d'espace entre les deux lignes.

Très nouveau pour python et beautifulsoup, quelqu'un peut-il donner un coup de main?

Répondre

3

Vous pouvez passer d'un niveau à un autre en utilisant cell = rows[0].find('td'), puis voir son contenu en utilisant cell.contents, puis filtrer les éléments dont vous avez besoin, puis join par espaces.

Autre option: vous pouvez utiliser une expression régulière pour remplacer le <br /> par un espace. pour que vous pouvez écrire:

import re 
s = re.sub('<br\s*?>', ' ', rows[0].text) 

Ensuite, vous pouvez remplacer plusieurs espaces blancs consécutifs par

s = re.sub('\s+', ' ', s) 

Ensuite, la chaîne devrait ressembler à ceci:

>>> print s 
<tr> <td align="left">Foo Bar </td> </tr> 

Ensuite, vous pouvez facilement extraire la partie vous avez besoin.

+0

Pour l'instant, je suis allé avec: 'print '' .join (str (a) a dans les lignes [0] .find ('td'). content) 'et je suis en train de retirer le'
'tags, mais j'espère que quelqu'un peut donner une solution un peu plus propre. On dirait que c'est un défaut dans beautifulsoup ou il me manque quelque chose. – Joseph

1

Vous pouvez envisager d'utiliser lxml au lieu de BeautifulSoup. lxml vous permet de rechercher des éléments en utilisant XPath ce qui (je pense) est plus facile que d'utiliser l'API de BeautifulSoup.

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())) 

cède

'Foo\nBar\n' 

et

for text in doc.xpath('//tr/*/text()'): 
    print(repr(text)) 

rendements

'Foo' 
'\nBar' 
Questions connexes