BeautifulSoup и разрывы строк в строке таблицы? - PullRequest
1 голос
/ 20 января 2012

Пример кода:

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 Bar» или даже если между двумя строками существовал фактический перевод строки, что было бы хорошо, но вывод, который я получаю, просто имеет «FooBar», обратите внимание, что пробелов нет между двумя линиями.

Очень плохо знаком с python и beautifulsoup, может кто-нибудь помочь?

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Вы можете перейти на один уровень дальше, используя 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>

Тогда вы можете легко извлечь нужную часть.

2 голосов
/ 20 января 2012

Возможно, вы захотите использовать lxml вместо BeautifulSoup. lxml позволяет искать элементы, используя XPath , что (я думаю) проще, чем использование API 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()))

выходы

'Foo\nBar\n'

и

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

выходы

'Foo'
'\nBar'
...