xpath的概述
- 简单来说xpath就是一种可以根据地址找到人的技术
- xpath(XML Path Language)可以在树状结构中寻找节点,可以通过元素和属性导航
- 它可以用来1. 解析网页 2. 不同网页结构不一样,所以我们灵活的采用更加适合这个网页的解析技术 3. 网页结构明显,可以采用xpath
解决问题
节点的关系
- 父(Parent) book元素是title、author、year、price元素的父
- 子(Children) title、author、year、price都是book元素的子
- 同胞(Sibling) title、author、year、price都是同胞
- 先辈(Ancestor) title元素的先辈是 book元素和bookstore元素
xpath-helper工具的安装
chrome插件 xpath helper
由于无法上传文件,请自行百度
xpath快速入门
/ | 从根节点选取 |
---|---|
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
//div/div[@class=“weather_li_left”]/a/@href
//div[@class=“iteminfo__line1__jobname”]/span/@title (前期一点一点写)
//*[@id=“positionList-hook”]/div/div[2]/a/div[1]/div[1] (后期随意)
// 我们找div标签 但是这个div标签我们不用考虑位置
会有很多叫div标签
[@class=“iteminfo__line1__jobname”]
[] 谓语 用来查找某个特定的节点或者包含某个指定值的节点 要被镶嵌在方括号中
/ 这个div class=“iteminfo__line1__jobname” 标签下面的span标签
@title 通过选取属性 title属性
lxml的使用
- 安装 pip install lxml -i https://pypi.douban.com/simple
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>
"""
html_elemt = etree.HTML(wb_data)
links = html_elemt.xpath('//li/a/@href')
items = html_elemt.xpath('//li/a/text()')
lst = []
for link in links:
data = {}
data['href'] = link
data['item'] = items[links.index(link)]
lst.append(data)
headers = {'href', 'item'}
with open(r"html_data.csv", mode='w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, headers)
writer.writeheader()
writer.writerows(lst)
思路分析
- 第一步 页面分析
- 确定目标url
- 页面结构
- 实现步骤
- 拿到网页的源码
- 把网页源码生成一个element对象
- 通过element对象实现xpath语法进行数据的爬取 title url quote…
- 保存数据 先保存到字典里面 再添加到列表里面
- 把列表中的数据保存到csv文件当中搞定
- 第二步 代码实现
实现步骤
#!/user/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/6/29 17:20
# @Author : yerennuo
# @File : 天气预报xpath.py
# @Software: PyCharm
from lxml import etree
import csv
import requests
url = 'http://www.weather.com.cn/weather/103010100.shtml'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
}
res = requests.request('get', url, headers=headers)
html = res.content.decode('utf-8')
html_data = etree.HTML(html)
time = html_data.xpath('//ul/li/h1/text()')
wea = html_data.xpath('//ul/li/p[@title]/text()')
h_tem = html_data.xpath('//ul/li/p/span/text()')
l_tem = html_data.xpath('//ul/li/p[@class="tem"]/i/text()')
win = html_data.xpath('//ul/li/p/em/span[1]/@title')
win_power = html_data.xpath('//ul/li/p[@class="win"]/i/text()')
h_tem.insert(0, ' ')
weathe_data = []
for i in time:
index = time.index(i)
data = {
'日期': i,
'天气': wea[index],
'最高温度': h_tem[index],
'最低温度': l_tem[index],
'风向': win[index],
'风力': win_power[index]
}
weathe_data.append(data)
header = ['日期', '天气', '最高温度', '最低温度', '风向', '风力']
with open("东京一周天气预报.csv", 'w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, header)
writer.writeheader()
writer.writerows(weathe_data)