XPath 案例补充+Beauitful Soup入门
XPath 案例补充
1. index 的应用
from lxml import etreeimport csvhtml = """<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 requestsfrom lxml import etreeimport csv# 发申请 获相应# url就是发动申请的指标urldef 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 变量