Pandas行追加异常求助:ScienceDirect爬取数据后列匹配错位
解决ScienceDirect爬取数据时文章类型与标题不匹配的问题
看起来你遇到的核心问题是给DataFrame追加文章类型时,没有对应到已有标题的行,反而新增了100行,这大概率是因为你用了行拼接的方式(比如append或者concat(axis=0)),而不是直接给DataFrame新增列。下面给你拆解原因和解决方案:
1. 从根源保证数据的一一对应性
最稳妥的方式是在同一个循环里同时获取单篇论文的标题和文章类型,这样能从根本上避免顺序错乱的问题:
from bs4 import BeautifulSoup as bs import pandas as pd # 假设你已经获取了目标页面的内容page_content soup = bs(page_content, 'html.parser') # 找到所有论文的容器元素(需要替换成ScienceDirect实际的类名/选择器) paper_containers = soup.find_all('div', class_='result-item-content') titles = [] article_types = [] # 只处理前100篇论文 for container in paper_containers[:100]: # 获取标题(替换成页面实际的标题选择器) title_tag = container.find('h2', class_='title') title = title_tag.text.strip() if title_tag else '无标题' titles.append(title) # 获取文章类型(替换成页面实际的类型选择器) type_tag = container.find('span', class_='article-type') art_type = type_tag.text.strip() if type_tag else '未知类型' article_types.append(art_type) # 直接创建包含两列的DataFrame df = pd.DataFrame({ '标题': titles, '文章类型': article_types })
2. 已分开爬取数据的修正方案
如果已经有了包含标题的DataFrame(共100行),且拿到了长度匹配的文章类型列表article_types,直接给DataFrame新增列即可,完全不需要行拼接:
# ✅ 正确方式:直接赋值新增列,自动匹配每行位置 df['文章类型'] = article_types
为什么之前会新增行?
如果你之前用了类似下面的错误代码,就会把文章类型当成新行追加到原DataFrame后:
# ❌ 错误:按行拼接,导致新增100行 df = df.append(pd.DataFrame({'文章类型': article_types}), ignore_index=True) # 或者 df = pd.concat([df, pd.DataFrame({'文章类型': article_types})], axis=0)
这种方式是合并两个DataFrame的行,而非给已有行添加新列,自然会变成200行。
3. 额外注意事项
- 处理元素缺失情况:有些论文可能未标注文章类型,用
if ... else避免代码报错 - 核对页面选择器:ScienceDirect可能会更新页面结构,要确保你用的类名/选择器和当前页面匹配(可通过浏览器开发者工具查看元素)
内容的提问来源于stack exchange,提问作者Vijay Ramesh
相关产品推荐
相关产品推荐

