1

我想在 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

欢迎您提出意见,您的建议将不胜感激。

4

3 回答 3

2

<p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>你去<b>元素和定位x2思想next_element。这都很好。但是要定位x3andx4你需要首先在元素层次结构中向上到封闭<p>元素,然后从那里找到以下<p>封闭的 sx3x4

于 2013-08-23T18:01:45.730 回答
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>您尝试捕获的标签没有子标签。根据您正在解析的真实网页,这部分可能会有所不同。

于 2013-08-23T18:44:59.270 回答
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,我想?我在工作,无法测试这段代码。

于 2013-08-23T18:34:52.423 回答