数据提取

从网页中提取结构化数据

数据提取策略

数据提取是爬虫的核心环节,我们需要将解析后的HTML数据转换为结构化的格式, 如列表、字典或JSON,以便后续处理和分析。

列表数据

提取同类元素的集合

字典数据

键值对形式的结构化数据

嵌套结构

复杂数据的层次化组织

数据清洗技巧

常见问题

  • • 多余的空格和换行
  • • 特殊字符和HTML实体
  • • 格式不一致的数据
  • • 缺失值的处理

解决方案

  • • strip()去除空白字符
  • • 正则表达式清洗
  • • 类型转换和格式化
  • • 默认值设置

小华的新闻数据提取

小华需要定期收集新闻网站的头条新闻,包括标题、发布时间、作者和阅读量。 她通过分析网页结构,建立了一个完整的数据提取流程。

原始HTML示例

<div class="news-item">
  <h2 class="title">Python新版本发布</h2>
  <span class="time">2023-11-22 14:30</span>
  <span class="author">科技记者</span>
  <span class="views">1.2万阅读</span>
</div>

提取后的数据

{
  "title": "Python新版本发布",
  "time": "2023-11-22 14:30",
  "author": "科技记者",
  "views": 12000,
  "url": "https://news..."
}
import requests
from bs4 import BeautifulSoup
import re

def extract_news_data(url):
    """提取新闻数据"""
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'lxml')
    
    news_list = []
    items = soup.find_all('div', class_='news-item')
    
    for item in items:
        # 提取并清洗数据
        title = item.find('h2', class_='title').text.strip()
        time_str = item.find('span', class_='time').text.strip()
        author = item.find('span', class_='author').text.strip()
        views_text = item.find('span', class_='views').text.strip()
        
        # 数据清洗
        views = clean_views_count(views_text)
        
        news_list.append({
            'title': title,
            'time': time_str,
            'author': author,
            'views': views
        })
    
    return news_list

def clean_views_count(text):
    """清洗阅读量数据"""
    match = re.search(r'(\d+\.?\d*)万?', text)
    if match:
        count = float(match.group(1))
        if '万' in text:
            count *= 10000
        return int(count)
    return 0

8个练习题

练习1:价格数据清洗

从文本中提取价格数字,处理"¥1,999"等格式。

# 目标:将"¥1,999"转换为1999

练习2:日期格式统一

将不同格式的日期统一为YYYY-MM-DD格式。

# 提示:处理"2023年11月22日"等格式

练习3:缺失值处理

处理提取过程中可能遇到的缺失数据。

# 目标:为缺失值设置合理的默认值

练习4:数据验证

验证提取的数据是否符合预期格式和范围。

# 提示:检查邮箱格式、手机号等

练习5:批量处理

批量处理多个网页的数据提取任务。

# 目标:循环处理URL列表

练习6:数据去重

去除提取数据中的重复项。

# 提示:使用set()或字典去重

练习7:JSON导出

将提取的数据保存为JSON格式文件。

# 目标:使用json.dump()保存数据

练习8:性能优化

优化数据提取过程,提高处理速度。

# 提示:批量处理和缓存策略

在线练习

数据提取器