首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用汤在两个元素之间获取元素

用汤在两个元素之间获取元素
EN

Stack Overflow用户
提问于 2019-10-10 20:30:25
回答 2查看 45关注 0票数 1

我有以下HTML代码:

代码语言:javascript
复制
<div class="info">
    <div class="left-wrap"><span class="date">DATE-1</span></div>
</div>

<div class="clients-list">
        <div>
            <span class="client" >client1</span>
            <span class="client" >client2</span>
            <span class="client" >client3</span>
        </div>
    </div>

<div class="info">
    <div class="left-wrap"><span class="date" >DATE-2</span></div>
</div>
<div class="clients-list">
        <div>
            <span class="client" >client4</span>
            <span class="client" >client5</span>
        </div>
</div>

我想获得与每一次约会相关的数据,我做了以下工作:

代码语言:javascript
复制
date = []
clients = []
for item in soup.find_all(class_='date'):
    date.append(item.get_text().strip())
for item in soup.find_all(class_='client'): 
    clients.append(item.get_text().strip())
print date
print clients

最后,我得到了包含"date1“和"date2”的日期列表,以及包含clients1到clients5的客户端列表。

我的问题是,我无法用日期映射客户端,例如client1、client2和client3以及与date1相关的客户端,但我没有找到任何方法来知道每个日期下将有多少客户端。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-10 20:44:56

尝试this.Use find_next()查找下一个div标记,然后查找find_all() span标记。

代码语言:javascript
复制
from bs4 import BeautifulSoup
html='''<div class="info">
    <div class="left-wrap"><span class="date">DATE-1</span></div>
</div>

<div class="clients-list">
        <div>
            <span class="client" >client1</span>
            <span class="client" >client2</span>
            <span class="client" >client3</span>
        </div>
    </div>

<div class="info">
    <div class="left-wrap"><span class="date" >DATE-2</span></div>
</div>
<div class="clients-list">
        <div>
            <span class="client" >client4</span>
            <span class="client" >client5</span>
        </div>
</div>'''

soup=BeautifulSoup(html,'html.parser')
dates=soup.find_all(class_='date')
for date in dates:
  print(date.text)
  for item in date.find_next(class_='clients-list').find_all(class_='client'):
       print(item.text)

输出

代码语言:javascript
复制
DATE-1
client1
client2
client3
DATE-2
client4
client5
票数 2
EN

Stack Overflow用户

发布于 2019-10-10 20:38:43

您可以使用itertools.groupby

代码语言:javascript
复制
from bs4 import BeautifulSoup as soup
import itertools as it, re
data = soup(html, 'html.parser').find_all('span', {'class':re.compile('client|date')})
r = [[i.text for i in b] for _, b in it.groupby(data, key=lambda x:x['class'][0] == 'client')]
result = {r[i][0]:r[i+1] for i in range(0, len(r), 2)}

输出:

代码语言:javascript
复制
{'DATE-1': ['client1', 'client2', 'client3'], 'DATE-2': ['client4', 'client5']}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58330644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档