xpath
网络请求模块 正则表达式
比如:
人才的标准python技术好 工作能力强 颜值高 (不要工资的)
xxx地方 xxx街道xxx人才市场xxx写字楼 data
所以 xpath就是一种可以根据地址找人的技术
xpath的概念
xpath -> XML Path Language XML的查询语言 节点 文档中通过元素的属性进行导航
XML 可扩展标记语言 和html差不多,还有简单的数据存储功能
html 超文本标记语言 可用于创建网页
lxml 是Python当中的一个第三方的库 将html文本转换成了xml对象 有了这个对象就可以执行xpath功能
节点之前的关系
### xpath的工具使用
谷歌 chrome 插件 xpath-helper
chrome插件xpath-helper
1 chrome://extensions/扩展程序
2.之间拖拽文件 如果文件无法安装 那么把文件的后缀crx -->rar
3.双击解压
4.扩展程序里面点击第一个选项(加载已解压的扩展程序)
火狐 firefox 插件 xpath checker
ctrl + shift + x 就可以打开xpath 工具
//div[@class='iteminfo__line1__jobname']/span/text()
@ 选取属性 来定位标签
[ ] 谓语 用来查找某个特定的节点或者包含某个特定值的节点 谓语被镶嵌到方括号中
//div[@class='soupager']/span[1]
//div[@class='soupager']/span[position()=1]
//div[@class='soupager']/span[last()]
//div[@class='soupager']/span[position()<4] 显示1 2 3 页
lxml模块的使用
安装pip install lxmln / pip install lxml -i https://pypi.douban.com/simple
作用:
1.from lxml import etree
2.得到响应的结果 网页源码
3.etree.HTML(网页源码) ---> 返回一个element对象
4.element对象 就可以像xpath进行导航了
## csv
是python当中的一个内置模块 可以通过excel 数据库
csv 模块 专门用于处理csv文件的读取
写入csv文件
1.通过创建writer对象 主要用到2个方法。一个是writerow 写入一行。另
一个是writerows写入多行
2.使用DictWriter可以使用字典的方式把数据写入进去
读取文件
1.通过reader()读取到的每一条数据是一个列表 可以通过下标的方式获取具体某一个值
2.通过DictReader()读取到的数据是一个字典 可以通过key值(列名)的方式获取数据
lxml模块.py
# @ Time : 2021/2/24 20:35
# @ Author : Ellen
from lxml import etree
import csv
wb_data = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
"""
element = etree.HTML(wb_data)
print(element)
# 获取li标签下面的href属性
links = element.xpath('//li/a/@href')
# 获取li标签下a标签的文本数据
result = element.xpath('//li/a/text()')
# print(result)
print('links=', links) # --> ['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
print('result=', result) # --> ['first item', 'second item', 'third item', 'fourth item', 'fifth item']
# 需求把结果组合到字典当中
# {'href': 'link1.html', 'title': 'first item'} {'href': 'link2.html', 'title': 'second item'}... 将结果保存到csv文件当中
lst = []
for link in links:
d = {}
d['href'] = link
# 获取下标索引值
d['title'] = result[links.index(link)]
# print(d)
# 把爬取到的数据添加到列表中
lst.append(d)
titles = ('href', 'title')
with open('练习.csv', 'w', encoding='utf-8', newline='') as file_obj:
writer = csv.DictWriter(file_obj, titles)
writer.writeheader()
writer.writerows(lst)
csv模块.py
# @ Time : 2021/2/24 21:51
# @ Author : Ellen
import csv
# 写入数据 第一种方式
# headers = ('name', 'age', 'height')
# persons = [('我的梦', 18, 178), ('125', 20, 180), ('城', 25, 190)]
#
# with open('persons.csv', 'w', encoding='utf-8')as file_obj:
# writer = csv.writer(file_obj)
# writer.writerow(headers)
# for data in persons:
# writer.writerow(data)
# writerrows
# headers = ('name', 'age', 'height')
# persons = [('我的梦', 18, 178), ('125', 20, 180), ('城', 25, 190)]
#
# with open('persons.csv', 'w', encoding='utf-8', newline='')as file_obj:
# writer = csv.writer(file_obj)
# writer.writerow(headers)
# writer.writerows(persons)
# 第二种的写入方式
# 字典里的key值要和表头里面的保持一致
# headers = ('name', 'age', 'height')
# persons = [{'name': '我的梦', 'age': 18, 'height': '178'},
# {'name': '125', 'age': 18, 'height': '180'},
# {'name': '城', 'age': 18, 'height': '190'}
# ]
# with open('persons.csv', 'w', encoding='utf-8', newline='') as file_obj:
# writer = csv.DictWriter(file_obj, headers)
# writer.writeheader()
# writer.writerows(persons)
# 读取文件
# 方式一
# with open('persons.csv', 'r', encoding='utf-8') as file_obj:
# readr = csv.reader(file_obj)
# for x in readr:
# print(x[0])
# 方式二
with open('persons.csv', 'r', encoding='utf-8') as file_obj:
reader = csv.DictReader(file_obj)
for x in reader:
# print(x)
print(x['name'])