Идея заключается в том, чтобы найти strong
тег по тексту, а затем с помощью find_next_siblings()
, найти все соседние теги и остановить на следующий strong
тег:
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup, NavigableString
data = u"""
<p>
<strong>Adresa:</strong>Obecný úrad Nána<br></br>Madáchova 32<br></br>943 60 Nána<br></br><br></br>
<strong>Telefón:</strong>036/759 70 06<br></br>
<strong>Fax:</strong>036/7597 007<br></br>
<strong>Web:</strong><a href="http://www.obecnana.sk"></a><br></br>
</p>
"""
soup = BeautifulSoup(data)
address = soup.find(text='Adresa:')
texts = []
for item in address.parent.find_next_siblings():
if item.name == 'strong':
break
text_before = item.previous_sibling
if isinstance(text_before, NavigableString):
texts.append(text_before)
print ' '.join(texts)
Он печатает:
Obecný úrad Nána Madáchova 32 943 60 Nána
Затем, вы можете извлечь код в хороший многоразовой функции:
def get_section_text(text):
section = soup.find(text=text)
if not section:
raise ValueError("Section not found")
texts = []
for item in section.parent.find_next_siblings():
if item.name == 'strong':
break
text_before = item.previous_sibling
if isinstance(text_before, NavigableString):
texts.append(text_before)
return ' '.join(texts)
И называют его по разным разделам:
print get_section_text('Adresa:')
print get_section_text('Telefón:')
print get_section_text('Fax:')
Это будет печатать:
Obecný úrad Nána Madáchova 32 943 60 Nána
036/759 70 06
036/7597 007
Для несуществующего раздела:
print get_section_text('ILLEGAL SECTION')
это вызывает исключение
ValueError: Section not found
Я думаю, что вы в основном изобретать 'find_next_siblings()' здесь. – alecxe
Я полагаю, что это так, но для этого конкретного приложения это выглядит более кратким. – mhawke