返回div中的元素,直到classname更改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>

我试图返回一个带有列表的列表。每个分块列表应该包含标题,信息栏直到下一个标题。例如,它看起来像这样:[['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)

这可以工作,但是它不返回最后一个heading, info列表。

选择所有标题,迭代它们和它们的find_next_siblings(),并打破如果信息不在其类列表中:

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

最新更新