获取由标签/ BS4分隔的文本

时间:2014-09-14 14:16:04

标签: python html beautifulsoup html-parsing

如何从标签获取文本,其中属性由
或标签分隔?例如,对于下面代码中的“Adresa:”,我尝试获取地址:soup.find('strong', text = 'Adresa:')但我不知道如何在<strong>Adresa:</strong>之后和<strong>Telefón:</strong>之前获取文字。< / p>

输出应为: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>

2 个答案:

答案 0 :(得分: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 :(得分: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