Использование Beautifulsoup для извлечения текста между переносами строк (например,теги) - PullRequest
16 голосов
/ 11 марта 2011

У меня есть следующий HTML-код, который находится в большом документе

<br />
Important Text 1
<br />
<br />
Not Important Text
<br />
Important Text 2
<br />
Important Text 3
<br />
<br />
Non Important Text
<br />
Important Text 4
<br />

В настоящее время я использую BeautifulSoup для получения других элементов в HTML, но мне не удалось найти способ разместить важные строки текста между тегами <br />. Я могу выделить и перейти к каждому из элементов <br />, но не могу найти способ вставить текст между ними. Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 3 ]

22 голосов
/ 11 марта 2011

Если вам нужен любой текст, который находится между двумя тегами <br />, вы можете сделать что-то вроде следующего:

from BeautifulSoup import BeautifulSoup, NavigableString, Tag

input = '''<br />
Important Text 1
<br />
<br />
Not Important Text
<br />
Important Text 2
<br />
Important Text 3
<br />
<br />
Non Important Text
<br />
Important Text 4
<br />'''

soup = BeautifulSoup(input)

for br in soup.findAll('br'):
    next_s = br.nextSibling
    if not (next_s and isinstance(next_s,NavigableString)):
        continue
    next2_s = next_s.nextSibling
    if next2_s and isinstance(next2_s,Tag) and next2_s.name == 'br':
        text = str(next_s).strip()
        if text:
            print "Found:", next_s

Но, может быть, я неправильно понял ваш вопрос? Ваше описание проблемы, кажется, не совпадает с "важным" / "не важным" в данных вашего примера, поэтому я пошел с описанием;)

6 голосов
/ 11 марта 2011

Итак, в целях тестирования, давайте предположим, что этот фрагмент HTML находится внутри тега span:

x = """<span><br />
Important Text 1
<br />
<br />
Not Important Text
<br />
Important Text 2
<br />
Important Text 3
<br />
<br />
Non Important Text
<br />
Important Text 4
<br /></span>"""

Теперь я собираюсь проанализировать его и найти мой тег span:

from BeautifulSoup import BeautifulSoup
y = soup.find('span')

Если вы выполните итерацию по генератору в y.childGenerator(), вы получите как br, так и текст:

In [4]: for a in y.childGenerator(): print type(a), str(a)
   ....: 
<type 'instance'> <br />
<class 'BeautifulSoup.NavigableString'> 
Important Text 1

<type 'instance'> <br />
<class 'BeautifulSoup.NavigableString'> 

<type 'instance'> <br />
<class 'BeautifulSoup.NavigableString'> 
Not Important Text

<type 'instance'> <br />
<class 'BeautifulSoup.NavigableString'> 
Important Text 2

<type 'instance'> <br />
<class 'BeautifulSoup.NavigableString'> 
Important Text 3

<type 'instance'> <br />
<class 'BeautifulSoup.NavigableString'> 

<type 'instance'> <br />
<class 'BeautifulSoup.NavigableString'> 
Non Important Text

<type 'instance'> <br />
<class 'BeautifulSoup.NavigableString'> 
Important Text 4

<type 'instance'> <br />
0 голосов
/ 02 февраля 2016

У меня сработало следующее:

for br in soup.findAll('br'):
    if str(type(br.contents[0])) == '<class \'BeautifulSoup.NavigableString\'>':
       print br.contents[0]
...