XPath 案例补充 +Beauitful Soup 入门
XPath 案例补充
1. index 的应用
from lxml import etree
import csv
html = """
<html>
<head>
<title> 测试 </title>
</head>
<body>
<li class="item-0">first item</li>
<li class="item-1">second item</li>
<li class="item-inactive">third item</li>
<li class="item-1">fourth item</li>
<div>
<li class="item-0">fifth item</li>
</div>
<span>
<li class="item-0">sixth item</li>
<div>
<li class="item-0">eighth item</li>
</div>
</span>
</body>
</html>
"""
tree = etree.HTML(html)
# [m:n] 左闭右开
texts = tree.xpath('//li/text()')[:3]
cs = tree.xpath('//li/@class')[:3]
# print(texts) # ['first item', 'second item', 'third item']
# print(cs) # ['item-0', 'item-1', 'item-inactive']
# 定义一个列表 用来寄存所有数据
lst_data = []
for c in cs:
# 定义一个字典 用来寄存一条数据
d ={}
# print(c)
lst_index = cs.index(c) # 取得 c 所对应的索引
# print(lst_index)
# print(texts[lst_index]) # cs 中 c 所对应的 texts 值
d['class'] = c
d['text'] = texts[lst_index]
# print(d)
lst_data.append(d)
print(lst_data) # [{'class': 'item-0', 'text': 'first item'}, {'class': 'item-1', 'text': 'second item'}, {'class': 'item-inactive', 'text': 'third item'}]
# 保留数据
header = ['class', 'text']
with open('data.csv', 'w', encoding='utf-8', newline='') as f:
w = csv.DictWriter(f, header)
w.writeheader()
w.writerows(lst_data)
2. 豆瓣 TOP250 爬取
(1) 指标 :练习 XPath 的应用
(2) 步骤 :a. 发送申请 获取响应 失去 html 文件 –> b. 解析数据 取得所需数据 寄存字典列表 z 中 –> c. 保留数据于 csv 文件中
(3) 须要用到的工具 :requests lxml csv
(4) 进行翻页解决(?)
import requests
from lxml import etree
import csv
# 发申请 获相应
# url 就是发动申请的指标 url
def get_source(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
res = requests.get(url, headers=headers)
html = res.content.decode('utf-8')
# print(html)
return html
# 解析数据
def parsed_source(html):
# 将网页源码加载成一个 element 对象
tree = etree.HTML(html)
# text() 获取文本数据
# title = tree.xpath('//div[@class="info"]/div[@class="hd"]/a/span/text()')
# print(title)
divs = tree.xpath('//div[@class="info"]')
# print(len(divs))
# 用来寄存所有数据的大列表
lst_data = []
for div in divs:
# 用来存储一条数据的字典
d = {}
# print(div)
# 列表的下标索引值是从 0 开始的
# strip()用来解决字符串外面头和尾的空白字符
title = div.xpath('./div[@class="hd"]/a/span/text()')[0].strip()
score = div.xpath('./div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0].strip()
# span[last()] 获取最初一个 span 标签
com_num = div.xpath('./div[@class="bd"]/div[@class="star"]/span[last()]/text()')[0].strip()
quote = div.xpath('./div[@class="bd"]//span[@class="inq"]/text()')[0].strip()
link_url = div.xpath('./div[@class="hd"]/a/@href')[0]
d['title'] = title
d['score'] = score
d['com_num'] = com_num
d['quote'] = quote
d['link_url'] = link_url
# print(title, score, com_num, quote, link_url)
# 把寄存一条数据的字典插入列表
lst_data.append(d)
# print(lst_data)
return lst_data
# 保留数据
def save_data(lst_data, header):
# w--> 写 从头开始写 a--> 追加
with open('movie_data.csv', 'a', encoding='utf-8', newline='') as f:
w = csv.DictWriter(f, header)
# 写入表头
w.writeheader()
# writerows 一次性写入多行数据
w.writerows(lst_data)
# 主函数 调用函数
def main():
url = 'https://movie.douban.com/top250?start=0'
h = get_source(url)
header = ['title', 'score', 'com_num', 'quote', 'link_url']
movie_data = parsed_source(h)
save_data(movie_data, header)
if __name__ == '__main__':
main()
Beautiful Soup 入门
基础知识
- 定义:Beautiful Soup 是一个能够从 HTML 或 XML 文件中提取数据的网页信息提取库
- 作用:用来解析和提取数据的
- 比照不同数据解析形式
(1)正则表达式 简单
(2)XPath 语法 例如 / // 等
(3)bs4 办法 例如 find() fing_all()
bs4 源码剖析
- structure 页面 导航页面 展现架构
-
图标
(1)c class 类
(2)m method 办法
(3)f field 字段
(4)p property 装璜器
(5)v variable 变量