You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BeautifulSoup从单个div中提取多个文本元素并在Flask模板中正确展示?

如何用BeautifulSoup从单个div中提取多个文本元素并在Flask模板中正确展示?

嗨,我来帮你解决这个问题!你遇到的核心问题是没把每个职位的标题和对应描述绑定在一起,而且循环写法有误——jobs是BeautifulSoup返回的ResultSet对象,不能像函数那样调用它。下面是具体的解决步骤:

第一步:修正Python代码逻辑

我们要遍历每个职位卡片(card-job),在每个卡片内部单独提取标题和描述,这样能保证标题和描述绝对一一对应。具体代码如下:

from bs4 import BeautifulSoup
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    # 假设source是你获取到的网页源码
    soup = BeautifulSoup(source, 'lxml')
    # 获取所有职位卡片容器
    job_cards = soup.find_all("div", {"class": "card-job"})
    
    jobs_list = []
    for card in job_cards:
        # 在当前卡片内提取职位标题
        title_tag = card.find("h2", {"class": "card-title"})
        job_title = title_tag.get_text(strip=True) if title_tag else "无职位标题"
        
        # 在当前卡片内提取职位描述(job-meta下的所有列表项)
        meta_items = card.find("ul", {"class": "job-meta"}).find_all("li")
        # 把多个列表项拼接成一个字符串,也可以保留列表形式
        job_description = " | ".join([item.get_text(strip=True) for item in meta_items])
        
        # 将当前职位的标题和描述存入字典,再添加到列表中
        jobs_list.append({
            "title": job_title,
            "description": job_description
        })
    
    # 把包含配对信息的列表传给模板
    return render_template('home.html', jobs=jobs_list)

第二步:修改Flask模板展示逻辑

现在jobs是一个字典列表,每个字典都包含对应职位的title和description,模板里可以这样遍历展示:

<div class="jobs">
    {% for job in jobs %}
        <div class="job-item">
            <h3>{{ job.title }}</h3>
            <p>{{ job.description }}</p>
        </div>
    {% endfor %}
</div>

为什么你的原代码出错?

你写的jobs(soup.find_all(...), ...)是错误的,因为soup.find_all("div", {"class": "card-job"})返回的是ResultSet(类似列表的对象),它不是函数,不能用括号调用。而且这种强行把所有标题和所有描述配对的方式,虽然现在页面结构顺序对应,但一旦页面有变动(比如某个卡片缺失元素),就会出现标题和描述错位的问题——而我们在每个卡片内部提取的方法,完全避免了这个风险。

备注:内容来源于stack exchange,提问作者hemoglobin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 09:33:06