如何用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()
关键解析
- 请求头设置:Discogs会拦截无标识的爬虫请求,必须加
User-Agent模拟浏览器访问 - 标签定位逻辑:直接遍历所有
<li>标签,通过文本前缀匹配找到目标项,避免因页面嵌套复杂导致定位失败 - 异常处理:捕获请求错误、解析错误等情况,保证程序不会中途崩溃,同时记录错误信息
- 防反爬延迟:每个请求间隔1秒,避免触发Discogs的频率限制
注意事项
- 如果你的URL文件编码不是UTF-8,修改
open函数的encoding参数(比如gbk) - 若页面结构变化,可改用正则匹配:
import re; match = re.search(r'Mastered At: (.+)', text)来提取内容 - 批量处理大量URL时,可考虑多线程(但要控制并发数,避免被封)
内容的提问来源于stack exchange,提问作者Aeox
相关产品推荐
相关产品推荐

