如何用BeautifulSoup抓取网页标题及对应段落并导出为CSV?
用BeautifulSoup实现标题与对应段落的抓取及CSV输出
完全可以实现你的需求,以下是修改后的代码及关键逻辑说明:
完整代码
from bs4 import BeautifulSoup import requests # 获取网页内容 website = requests.get('https://venngage.com/blog/landing-page-examples/') soup = BeautifulSoup(website.content, 'html.parser') # 目标抓取的标题标签 target_headings = ['h2', 'h3', 'h4'] # 用于识别后续兄弟节点是否为新标题的标签集合 all_headings = ['h1', 'h2', 'h3', 'h4'] # 打开文件准备写入CSV(也可直接打印输出) with open('heading_content.csv', 'w', encoding='utf-8') as output_file: # 遍历所有目标标题 for heading in soup.find_all(target_headings): heading_type = heading.name.upper() # 提取标题文本并去除前后空白 heading_text = heading.get_text(strip=True) # 收集当前标题下的所有段落文本 paragraph_list = [] # 遍历标题的后续兄弟节点 for sibling in heading.next_siblings: # 遇到新的标题则停止收集 if sibling.name in all_headings: break # 仅处理p标签,跳过空段落 if sibling.name == 'p': p_content = sibling.get_text(strip=True) if p_content: paragraph_list.append(p_content) # 将多段落文本用换行符连接 combined_paragraphs = '\n'.join(paragraph_list) # 生成符合要求的行(用双引号包裹字段,避免特殊字符破坏CSV格式) output_line = f'"{heading_type}";"{heading_text}";"{combined_paragraphs}"' # 写入文件并打印 output_file.write(output_line + '\n') print(output_line)
关键逻辑说明
- 遍历标题后续内容:通过
heading.next_siblings获取标题之后的所有兄弟节点,确保只抓取当前标题下方的内容,不会混入其他标题的段落。 - 终止条件判断:当遍历到新的标题标签(h1-h4)时,停止收集段落,避免跨标题混采内容。
- 段落处理:仅提取
p标签的文本,跳过空段落,并用换行符连接多个段落,符合你的格式要求。 - CSV格式兼容:用双引号包裹每个字段,避免文本中出现的分号、逗号等特殊字符导致CSV文件格式错乱,保证文件可直接用Excel等工具打开。
内容的提问来源于stack exchange,提问作者Outbound
相关产品推荐
相关产品推荐

