使用BeautifulSoup在Python中解析多个段落

时间:2013-08-23 17:44:33

标签: python beautifulsoup

我想在Python中使用BeautifulSoup来解析来自这样的html

的html
<p><b>Background</b><br />x0</p><p>x1</p>
<p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>
<p><b>Activities</b><br />x5</p><p>x6</p>"

到这个结果:

Background: x0, x1
Innovation: x2, x3, x4
Activities: x5, x6

我已经厌倦了使用下面的python脚本:

from bs4 import BeautifulSoup
htmltext = "<p><b>Background</b><br />x0</p><p>x1</p>
         <p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>
         <p><b>Activities</b><br />x5</p><p>x6</p>"
html = BeautifulSoup(htmltext)
for n in html.find_all('b'):
    title_name = n.next_element
    title_content = n.nextSibling.nextSibling
    print title_name, title_content

然而,我只能得到这个:

Background: x0
Innovation: x2
Activities: x5

欢迎您提出意见,我们将非常感谢您的建议。

3 个答案:

答案 0 :(得分:2)

<p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>中,您将转到<b>元素并找到x2以为next_element。这一切都很好。但要找到x3x4,首先需要将元素层次结构上升到封闭的<p>元素,然后从那里找到包含<p>的{​​{1}}个x3 }和x4

答案 1 :(得分:1)

我对beautifulsoup很新,但这对我有用:

import bs4
from bs4 import BeautifulSoup

htmls = """<p><b>Background</b><br />x0</p><p>x1</p>
           <p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>
           <p><b>Activities</b><br />x5</p><p>x6</p>"""
html = BeautifulSoup(htmls)

for n in html.find_all('b'):
    title_name = n.next_element
    title_content = n.nextSibling.nextSibling

    results = [title_content]
    for f in n.parent.find_next_siblings():
        el = f.next_element
        if isinstance(el, bs4.element.Tag) and el.name == 'b':
            break
        results.append(el)

    print title_name, results

结果:

Background [u'x0', u'x1']
Innovation [u'x2', u'x3', u'x4']
Activities [u'x5', u'x6']

我选择使用isinstance(el, bs4.element.Tag) and el.name == 'b'作为分隔符,因为在您的示例中,您尝试捕获的<p>代码没有子代。根据您要解析的真实网页,这部分可能会略有不同。

答案 2 :(得分:0)

在您再阅读一个标签后,您需要继续停止,直到您点击下一个<b>为止。 nextSibiling无法正常工作,因为您解析的<p>不是<b>的兄弟姐妹。尝试这样的事情:

def in_same_section(n):
    try:
        return n.next_element.name != u'b'
    except AttributeError:
        return True


from bs4 import BeautifulSoup
htmltext ='''<p><b>Background</b><br />x0</p><p>x1</p>
         <p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>
         <p><b>Activities</b><br />x5</p><p>x6</p>'''
html = BeautifulSoup(htmltext)
for n in html.find_all('b'):
    title_name = n.string
    title_content = []
    while in_same_section(n):
        n = n.next_element
        try:
            if n.name == u'p':
                title_content += n.string
        except AttributeError:
            pass

编辑:修复了AttributeError,我想?我在工作,无法测试此代码。