网页抓取时如何拆分<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
相关产品推荐
相关产品推荐

