BeautifulSoup - 帮我选择div和类

1 投票
2 回答
732 浏览
提问于 2025-04-16 15:39

这是我的HTML代码:

<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"})

但是这样做只会让我看到一个空白的屏幕。我想知道我能不能从 blockA 中用 findAll 找到数据,显示出来,然后再从 BlockB 开始另一个循环,做同样的事情?

谢谢。

补充:对于那些问的人,我只是想简单地循环这些值,并输出成这样的JSON格式:

BlockA
    John Smith
    2
    Paul Peterson
    14

BlockB
    Steve Whoever
    123
    Mr Whathisface
    23

2 个回答

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']}]
1

你想找到那些包含"class"属性为"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>]

撰写回答