BeautifulSoup - 帮我挑选div和课程

时间:2011-04-13 15:50:30

标签: python html json beautifulsoup

继承我的HMTL代码:

<div class="BlockA">
    <h4>BlockA</h4>
    <div class="name">John Smith</div>
    <div class="number">2</div>
    <div class="name">Paul Peterson</div>
    <div class="number">14</div>
</div>

<div class="BlockB">
    <h4>BlockB</h4>
    <div class="name">Steve Jones</div>
    <div class="number">5</div>
</div>

注意BlockABlockB。两者都包含相同的元素,即namenumber,但都在单独的类中。我是python的新手,正在考虑尝试类似的东西:

parsedHTML = soup.findAll("div", attrs={"name" : "number"})

但这只是给我一个空白的屏幕。我是否可以在findAll内执行blockA,显示数据,然后从BlockB开始另一个循环并执行相同操作?

感谢。

编辑:对于那些提问,我想简单地循环使用JSON中的值和输出,如下所示:

BlockA
    John Smith
    2
    Paul Peterson
    14

BlockB
    Steve Whoever
    123
    Mr Whathisface
    23

2 个答案:

答案 0 :(得分:1)

您想要找到包含“name”或“number”类属性的div吗?

>>> import re
>>> soup.findAll("div", {"class":re.compile("name|number")})

[<div class="name">John Smith</div>, <div class="number">2</div>, <div class="name">Paul Peterson</div>, <div class="number">14</div>, <div class="name">Steve Jones</div>, <div class="number">5</div>]

答案 1 :(得分:0)

您需要使用可能的class值列表。

soup.findAll('div', {'class': ['name', 'number']})

看到你的编辑后:

def grab_content(heading):
    siblings = [s.contents[0] for s in heading.findNextSiblings()]
    return {heading.contents[0]: siblings}

headings = soup.findAll('h4')
[grab_content(h) for h in headings]

原始HTML代码段的输出将为:

[{u'BlockA': [u'John Smith', u'2', u'Paul Peterson', u'14']},
 {u'BlockB': [u'Steve Jones', u'5']}]