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

网页抓取时如何拆分<p>标签内元素?提取分行名称与地址

嘿,我来帮你搞定这个问题!你的核心需求是从<p>标签里拆分出分行名称和地址,现有代码只是把整个<p>的内容一股脑捞出来了,没做拆分对吧?咱们一步步来调整:

首先,先优化你现有代码里获取文本的方式——你现在用正则去标签其实完全没必要,BeautifulSoup本身就有更靠谱的方法:k.get_text() 可以直接获取<p>标签里的纯文本,还能通过参数控制是否去掉多余空格换行,比转成字符串再用正则清洗干净多了。

接下来是关键的拆分步骤,这里得根据你目标页面里<p>标签的实际内容结构来(毕竟没看到HTML源码,但常见的两种情况我都给你列出来):

情况1:分行名称和地址用换行分隔

如果你的<p>内容是这种格式:

某某大街分行
北京市朝阳区某某大街123号

那咱们可以先把文本按换行拆分,再提取前两部分分别作为名称和地址:

text = p.get_text(strip=False)  # 保留换行,方便拆分
# 先清理掉空行和多余空格
clean_lines = [line.strip() for line in text.splitlines() if line.strip()]
if len(clean_lines) >= 2:
    branch_name = clean_lines[0]
    branch_address = clean_lines[1]
    Branch_list.append({"分行名称": branch_name, "地址": branch_address})

情况2:分行名称和地址用冒号(或其他分隔符)分隔

如果<p>内容是这种格式:

某某大街分行:北京市朝阳区某某大街123号

那直接用分隔符拆分就行,注意用split(':', 1)只拆一次,避免地址里也出现冒号的情况:

text = p.get_text(strip=True)
if ':' in text:  # 如果是英文冒号就换成':'
    branch_name, branch_address = text.split(':', 1)
    Branch_list.append({"分行名称": branch_name.strip(), "地址": branch_address.strip()})

整合后的完整代码

把上面的逻辑整合到你的代码里,最终版本大概是这样:

import requests
from bs4 import BeautifulSoup

url = "你的目标URL"  # 记得替换成实际URL
Branch_list = []

page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')

# 遍历目标div容器
for div in soup.find_all('div', class_="col-md-9 text-left"):
    p_tags = div.find_all('p')
    if not p_tags:
        continue  # 没找到p标签就跳过
    
    for p in p_tags:
        # 获取<p>里的原始文本,保留换行
        raw_text = p.get_text(strip=False)
        # 清理空行和多余空格
        clean_text = '\n'.join([line.strip() for line in raw_text.splitlines() if line.strip()])
        
        # 这里选一种拆分方式,或者可以加判断兼容两种情况
        # --- 用换行拆分的版本 ---
        parts = clean_text.split('\n')
        if len(parts) >= 2:
            Branch_list.append({
                "分行名称": parts[0],
                "地址": parts[1]
            })
        
        # --- 如果是冒号分隔,就注释上面的,打开下面的 ---
        # if ':' in clean_text:
        #     name, addr = clean_text.split(':', 1)
        #     Branch_list.append({"分行名称": name, "地址": addr})

# 打印结果验证
for info in Branch_list:
    print(f"分行:{info['分行名称']},地址:{info['地址']}")

额外提示

如果目标页面里的分行名称和地址其实是用子标签包裹的(比如<p>里有<strong>放名称,普通文本放地址),那直接通过查找子元素会更准确,比如:

branch_name = p.find('strong').get_text(strip=True)
branch_address = p.find(text=True, recursive=False).strip()  # 获取<p>里除了子标签的文本

这样就不用靠文本拆分啦,比纯文本拆分更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:12:30