Использование beautifulsoup для извлечения текста между разрывами строк (например, <br/">)
У меня есть следующий 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 />
, но не могу найти способ получить текст между ними. Любая помощь будет принята с благодарностью. Спасибо.
Ответы
Ответ 1
Если вам нужен только текст, находящийся между двумя тегами <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
Но, может быть, я неправильно понял ваш вопрос? Ваше описание проблемы, похоже, не соответствует "важному" / "не важному" в ваших примерах данных, поэтому я пошел с описанием;)
Ответ 2
Итак, для тестовых целей допустим, что этот фрагмент 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 />
Ответ 3
Следующие работали для меня:
for br in soup.findAll('br'):
if str(type(br.contents[0])) == '<class \'BeautifulSoup.NavigableString\'>':
print br.contents[0]