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

BeautifulSoup如何区分同一div下用途不同的同名p标签

samediv

问题说明

当前编写的BeautifulSoup爬取解析代码如下:

for j in links:
    Title = j.find('p').text.strip()
    Narration = j.find('p').text.strip()

    Link = j.find('a')['href'].strip()
    Date = j.find('time').text[-14:-1].strip()
    Label = '1'

运行代码时存在问题:同一父div节点下有2个同层级的<p>标签,分别对应需要提取的新闻标题(Title)、新闻叙述内容(Narration),但find('p')的写法仅会返回第一个匹配的p节点,无法分别提取两个p标签的内容,预期提取结果为:

Title = News Title
Narration = News Narration
可行解决方法

以下三种方法都可以实现同层级p标签的区分提取,根据实际页面结构选择即可:

  • 按标签顺序提取:使用find_all('p')获取当前节点下所有p标签的列表,按下标取值
    这是同层级固定顺序标签最简便的提取方式:
    for j in links:
        p_list = j.find_all('p')
        # 增加长度判断避免索引越界报错
        if len(p_list) >= 2:
            Title = p_list[0].text.strip()
            Narration = p_list[1].text.strip()
        else:
            # 结构异常时的兜底逻辑,可根据需求调整
            Title = ""
            Narration = ""
    
        Link = j.find('a')['href'].strip()
        Date = j.find('time').text[-14:-1].strip()
        Label = '1'
    
  • 按标签属性精准定位:如果两个p标签带有不同的class、id或其他自定义属性,直接在find时传入属性筛选条件,稳定性更高,不会受标签顺序变动影响
    示例(假设标题p带有class="title"属性、描述p带有class="desc"属性):
    for j in links:
        Title = j.find('p', class_='title').text.strip()
        Narration = j.find('p', class_='desc').text.strip()
    
        Link = j.find('a')['href'].strip()
        Date = j.find('time').text[-14:-1].strip()
        Label = '1'
    
  • 用CSS选择器定位:通过select_one方法搭配CSS伪类选择器,按位置匹配对应p标签
    for j in links:
        # 匹配父节点下第一个p标签
        Title = j.select_one('p:nth-of-type(1)').text.strip()
        # 匹配父节点下第二个p标签
        Narration = j.select_one('p:nth-of-type(2)').text.strip()
    
        Link = j.find('a')['href'].strip()
        Date = j.find('time').text[-14:-1].strip()
        Label = '1'
    

优先推荐按标签属性定位的方案,抗页面结构变动能力最强;如果p标签没有任何区分属性,再选择按顺序提取的方案。

内容的提问来源于stack exchange,提问作者AccelUp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:48:19