如何抓取段落不规则的新闻文章并完整存入DataFrame?
解决方案:完整抓取拆分的新闻段落并存入DataFrame
问题分析
你的代码使用soup_test.find(...)方法,该方法仅返回第一个匹配到的元素,因此只能获取第一段内容。网站通过无规律data-pos参数拆分段落,说明所有段落都属于同一类/属性的元素,需改用find_all()获取全部匹配项。
修改后的完整代码
import requests from bs4 import BeautifulSoup import pandas as pd def scrape_test(url): # 新增:请求目标URL并解析为BeautifulSoup对象(原代码缺失此关键步骤) response = requests.get(url) soup_test = BeautifulSoup(response.text, 'html.parser') titel = soup_test.find("h2").find(class_="align-middle").text autor = soup_test.find(class_="font-sansUI lg:text-base md:text-base sm:text-s text-shade-dark dark:text-shade-light mt-8").text datum = soup_test.find("time", class_="timeformat")["datetime"] # 修改:获取所有段落元素并拼接文本 paragraphs = soup_test.find_all(attrs={"class": "RichText lg:w-8/12 md:w-10/12 lg:mx-auto md:mx-auto lg:px-24 md:px-24 sm:px-16 break-words word-wrap"}) # 过滤空文本,用双换行拼接段落,保留原文结构 inhalt = '\n\n'.join([p.text.strip() for p in paragraphs if p.text.strip()]) artikelinformationen = { 'Titel': [titel], 'Autor': [autor], 'Datum': [datum], 'Artikel': [inhalt] } df = pd.DataFrame(artikelinformationen) return df df_test = scrape_test(url_test) print(df_test)
关键修改说明
- 补充页面请求逻辑:原代码未定义
soup_test,新增requests.get()和BeautifulSoup初始化步骤,确保能正确加载并解析目标页面。 - 替换
find为find_all:find_all()返回所有匹配的段落元素列表,而非单个元素,实现全段落抓取。 - 拼接段落文本:通过列表推导式提取每个段落的有效文本(过滤空内容),再用
\n\n拼接成完整文章,保留段落间的换行结构。
额外提示
- 若过长的class匹配容易出错,可简化为核心类名匹配:
soup_test.find_all(class_="RichText")(需确认该类仅对应文章段落)。 - 若遇到反爬拦截,可给
requests.get()添加请求头,示例: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'}。
内容的提问来源于stack exchange,提问作者Yeb0
相关产品推荐
相关产品推荐

