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

如何用Python提取网页h3及a标签内容并保存为DataFrame?

完整实现代码

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0"
headers = {"user-agent": USER_AGENT}

# 板块标识与中文名称映射
category_map = {
    'rql': '肉禽蛋',
    'scl': '水产类',
    'shucailei': '蔬菜类',
    'guopinlei': '果品类',
    'mmdr': '米面豆乳',
    'tiaoweipinl': '调味品',
    'yaoshiqita': '药食及其他'
}

# 存储所有数据的列表
all_data = []

for cate_key, cate_name in category_map.items():
    url = f'https://www.meishichina.com/YuanLiao/category/{cate_key}'
    resp = requests.get(url, headers=headers)
    resp.encoding = 'utf-8' # 避免中文乱码
    soup = BeautifulSoup(resp.content, "html.parser")
    
    # 定位到分类内容主容器,过滤无关节点
    cate_container = soup.find('div', class_='category_sub')
    if not cate_container:
        continue
    
    # 遍历当前页面所有分类
    for h3 in cate_container.find_all('h3'):
        class_name = h3.text.strip()
        # 找到当前分类对应的条目列表
        item_list = h3.find_next('ul')
        if not item_list:
            continue
        # 遍历该分类下所有条目
        for a in item_list.find_all('a', href=True):
            item_name = a.text.strip()
            item_url = a['href']
            all_data.append({
                '板块': cate_name,
                '分类': class_name,
                '条目名称': item_name,
                '条目链接': item_url
            })
    # 加延时避免触发反爬
    time.sleep(1)

# 转为DataFrame
df = pd.DataFrame(all_data)
# 可按需导出为CSV文件,utf_8_sig编码保证Excel打开无乱码
# df.to_csv('美食天下原料分类表.csv', index=False, encoding='utf_8_sig')
print(df.head())

实现逻辑说明

  • 提前定义板块标识和中文名称的映射,最终输出的板块字段直接为可读的中文名称
  • 解析DOM时先定位到class为category_sub的分类内容容器,避免提取到页面其他区域的无关h3标签
  • 利用find_next('ul')方法直接获取每个h3分类标题对应的条目列表,保证分类和条目对应关系准确
  • 统一设置响应编码为utf-8,避免中文乱码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:45:01