数据提取

从网页中提取结构化数据

数据提取策略

数据提取是爬虫的核心环节,我们需要将解析后的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:性能优化

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

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

在线练习

数据提取器