Return 中的元素 div 直到类名更改为 bs4

Return element in div until classname changes bs4

我正在尝试使用 Beautiful Soup 来打印 div 的元素。这有点难以解释,所以我简化了它。如果您需要更多说明,请告诉我 :) div 的结构如下:

<div>
    <div class="heading"></div>
    <div class="info"></div>
    <div class="heading"></div>
    <div class="info"></div>
    <div class="info"></div>
    <div class="heading"></div>
    <div class="info"></div>
</div>

我正在尝试 return 一个包含列表的列表。每个分块列表都应包含标题,以及信息 divs 直到下一个标题。例如,它看起来像这样:[['heading', 'info'], ['heading', 'info', 'info']...]

因此,我尝试这样做:

findAllDivs = container.find_all('div')

myList = []
for i in findAllDivs:

    if i['class'][0] == 'heading':
        
        try:
            if innerList:
                myList.append(innerList)
        except:
            pass

        innerList = []
        innerList.append(i)

    elif i['class'][0] == 'info':
        innerList.append(i)

这有效,但它不适用于 return 最后一个 heading, info 列表。

Select 所有 headers,遍历它们和它们的 find_next_siblings(),如果信息不在其 class 列表中则中断:

for h in soup.div.select('.heading'):
    d = [h.text]
    for i in h.find_next_siblings():
        if 'info' not in i.get('class'):
            break
        d.append(i.text)
    data.append(d)    
例子
from bs4 import BeautifulSoup

html = '''
<div>
    <div class="heading">head1</div>
    <div class="info">info1</div>
    <div class="heading">head2</div>
    <div class="info">info2.1</div>
    <div class="info">info2.2</div>
    <div class="heading">head3</div>
    <div class="info">info3</div>
</div>
'''
soup = BeautifulSoup(html)

data = []

for h in soup.div.select('.heading'):
    d = [h.text]
    for i in h.find_next_siblings():
        if 'info' not in i.get('class'):
            break
        d.append(i.text)
    data.append(d)

data
输出
[['head1', 'info1'], ['head2', 'info2.1', 'info2.2'], ['head3', 'info3']]