Python BeautifulSoup提取div内h4/p标签生成DataFrame结构化表格
Python BeautifulSoup 无表格HTML结构化爬取实现方案
前置依赖安装
在终端执行以下命令安装所需库:
pip install beautifulsoup4 requests pandas
beautifulsoup4:HTML解析与元素提取核心库requests:用于拉取在线网页的HTML内容,仅处理本地HTML文件时可不用安装pandas:用于快速组装、输出和保存结构化表格,也可根据需求替换为其他表格处理库
实现逻辑说明
核心处理流程如下:
- 加载HTML内容,支持在线爬取或本地文件读取
- 定位所有class属性为
ah-content的目标div块 - 遍历每个div块,提取内部
<h4>标签文本作为Name字段 - 按DOM顺序提取div下所有
<p>标签的文本,依次匹配Address、Address2、Phone字段 - 增加空值兼容逻辑,避免个别块标签缺失导致程序中断
- 组装所有提取结果为结构化表格,支持打印预览或导出为文件
完整可运行代码
from bs4 import BeautifulSoup import requests import pandas as pd # ---------- 1. 加载HTML内容 ---------- # 在线页面爬取模式:替换为实际目标URL TARGET_URL = "替换为你要爬取的页面地址" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } response = requests.get(TARGET_URL, headers=headers) response.encoding = "utf-8" html_content = response.text # 本地文件读取模式:如果处理本地HTML,注释掉上面的爬取代码,放开下面这段 # with open("your_local_file.html", "r", encoding="utf-8") as f: # html_content = f.read() # ---------- 2. 解析提取数据 ---------- soup = BeautifulSoup(html_content, "html.parser") # 定位所有目标内容块 content_blocks = soup.find_all("div", class_="ah-content") structured_data = [] for block in content_blocks: # 提取Name字段 name_tag = block.find("h4") name = name_tag.get_text(strip=True) if name_tag else "" # 提取所有p标签文本 p_tags = block.find_all("p") p_content_list = [tag.get_text(strip=True) for tag in p_tags] # 按顺序匹配字段,缺省值为空字符串 address = p_content_list[0] if len(p_content_list) >= 1 else "" address2 = p_content_list[1] if len(p_content_list) >= 2 else "" phone = p_content_list[2] if len(p_content_list) >= 3 else "" structured_data.append({ "Name": name, "Address": address, "Address2": address2, "Phone": phone }) # ---------- 3. 输出表格结果 ---------- result_df = pd.DataFrame(structured_data) # 控制台打印表格预览 print(result_df) # 导出为CSV文件,用Excel打开不会乱码 # result_df.to_csv("crawl_result.csv", index=False, encoding="utf-8-sig")
代码运行后输出的表格结构完全匹配需求,示例输出如下:
Name Address Address2 Phone 0 XYZ Community 123 Street Atlanta, Georgia, 12345 1234567890
注意事项
- 你提供的示例HTML中
<div class='ah-content'标签缺少闭合的>,实际页面如果存在这类语法小问题,BeautifulSoup自带的容错解析机制一般可以自动修正,不影响提取结果 - 如果页面是动态渲染的(内容由JS加载,直接请求拿到的HTML里没有目标div块),可以把
requests替换成selenium或者playwright拿到渲染后的HTML,后续解析逻辑完全一致 - 代码默认按p标签的出现顺序匹配字段,如果实际页面中p标签顺序有变动,可以根据文本特征(比如手机号为数字串、地址包含行政区划关键词等)做二次判断匹配
内容的提问来源于stack exchange,提问作者Learner27
相关产品推荐
相关产品推荐

