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

如何用BeautifulSoup从嵌套标签提取指定文本并生成CSV?

解决Discogs页面提取"Mastered At"工作室并导出CSV的问题

针对你的需求,直接给可运行的解决方案,解决嵌套<li>标签的提取问题,同时处理各种可能的异常情况:

核心步骤

  • 读取存储Discogs URL的文本文件(每行一个URL)
  • 逐个请求页面(加请求头模拟浏览器,避免被反爬)
  • 用BeautifulSoup定位包含Mastered At的<li>标签,提取对应的工作室名称
  • 将URL和提取到的内容逐行写入CSV文件

完整代码示例

import requests
from bs4 import BeautifulSoup
import csv
import time

# 配置参数
URL_FILE = "discogs_urls.txt"  # 你的URL文本文件路径
OUTPUT_CSV = "discogs_mastering_studios.csv"
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}

def extract_mastered_at(url):
    try:
        # 加延迟防反爬
        time.sleep(1)
        response = requests.get(url, headers=HEADERS)
        response.raise_for_status()  # 抛出HTTP错误
        soup = BeautifulSoup(response.text, "html.parser")
        
        # 遍历所有li标签,匹配目标项
        for li in soup.find_all("li"):
            text = li.get_text(strip=True)
            if text.startswith("Mastered At"):
                # 提取冒号后的工作室名称
                studio = text.split(":", 1)[1].strip()
                return studio
        # 未找到时返回空字符串
        return ""
    except Exception as e:
        print(f"处理URL {url} 出错: {str(e)}")
        return ""

def main():
    # 读取URL列表
    with open(URL_FILE, "r", encoding="utf-8") as f:
        urls = [line.strip() for line in f if line.strip()]
    
    # 写入CSV
    with open(OUTPUT_CSV, "w", newline="", encoding="utf-8") as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["专辑URL", "母带工作室"])  # 写入表头
        
        for url in urls:
            studio = extract_mastered_at(url)
            writer.writerow([url, studio])
            print(f"已处理: {url} -> {studio}")

if __name__ == "__main__":
    main()

关键解析

  1. 请求头设置:Discogs会拦截无标识的爬虫请求,必须加User-Agent模拟浏览器访问
  2. 标签定位逻辑:直接遍历所有<li>标签,通过文本前缀匹配找到目标项,避免因页面嵌套复杂导致定位失败
  3. 异常处理:捕获请求错误、解析错误等情况,保证程序不会中途崩溃,同时记录错误信息
  4. 防反爬延迟:每个请求间隔1秒,避免触发Discogs的频率限制

注意事项

  • 如果你的URL文件编码不是UTF-8,修改open函数的encoding参数(比如gbk)
  • 若页面结构变化,可改用正则匹配:import re; match = re.search(r'Mastered At: (.+)', text)来提取内容
  • 批量处理大量URL时,可考虑多线程(但要控制并发数,避免被封)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:54:19