2014-09-14 2 views
1

Как я могу получить текст из тега, где атрибуты разделены
или тегами? Например, для «Adresa:» в приведенном ниже коде я попытался получить адрес: soup.find('strong', text = 'Adresa:'), но я не знаю, как получить текст после <strong>Adresa:</strong> и до <strong>Telefón:</strong>.Получить текст, разделенный метками/BS4

Вывод должен быть: Adresa: Obecný úrad Nána, Madáchova 32, 943 60 Nána

Вот пример кода:

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

ответ

3

Идея заключается в том, чтобы найти 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 
1

Вы можете использовать next_sibling перебрать братьев и сестер в <strong>Adresa:</strong> теге до следующего <strong> тега видно, накапливая строки как вы идете. Наконец join() строки вместе, используя ', ' в качестве разделителя:

from bs4 import BeautifulSoup 

html = '''<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(html) 

e = soup.find('strong', text = 'Adresa:') 
e = e.next_sibling 
strings = [] 
while e and e.name != 'strong': 
    if e.string is not None: 
     strings.append(e) 
    e = e.next_sibling 

>>> print 'Adresa: %s' % ', '.join(strings) 
Adresa: Obecný úrad Nána, Madáchova 32, 943 60 Nána 
+0

Я думаю, что вы в основном изобретать 'find_next_siblings()' здесь. – alecxe

+0

Я полагаю, что это так, но для этого конкретного приложения это выглядит более кратким. – mhawke

Смежные вопросы