python爬取近一周天气并使用xpath解析

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

说白了就是找出xml文档中我们想要的内容,这里我们使用天气2345网站上的数据来举例,其网站主页面的源码如下:
在这里插入图片描述

这里我们想要提取从今天开始的一周内的天气情况,其中包括日期、天气情况、温度范围、风力大小、空气质量。这些数据都在我截取的图中可以找到,如今天2.28的数据:
在这里插入图片描述

我们发现每一天的数据都保存在这个li标签下面,而所有li标签又在<div class="seven-day">标签下,所以我们要先定位到这个标签下。

1. 爬取网页数据
这里的网页数据是静态的,所以爬取很简单:

import requests

url="http://tianqi.2345.com/today-71989.htm"
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36"
}
response=requests.get(url,headers=headers)

2. 生成html对象使用xpath
(1)获取html对象

from lxml import etree
html=etree.HTML(response.text)

(2)定位到class属性为"seven-day"div节点:

divs=html.xpath('//div[@class="seven-day"]')[0]

这里解释一下:

  1. //:查找所有li标签(不受限全局查找)
  2. [@class="seven-day"] :如果要查询属性,必须在属性名前使用@来装饰,这里加上中括号表示查找class属性为"seven-day"div节点
    3.后面[0]是因为生成出来的是列表,要取html对象

输出结果:
在这里插入图片描述
(3)找出div节点下的a标签,因为数据明细都集中在这个a标签下

lis=divs.xpath('./ul/li/a')

这里解释一下:

  1. .:表示从当前节点开始(.相当于//div[@class="seven-day"]
  2. / :表示下一个节点(必须父子节点,不能跨节点)

3. 利用xpath筛选出我们想要的数据`
(1)日期

li.xpath('./em/text()')

(2)天气情况

li.xpath('./i/text()')

(3)温度变化

li.xpath('./span[@class="tem-show"]/text()')

(4)风力

li.xpath('./span[@class="wind-name"]/text()')

(5)空气质量

li.xpath('./span[@class="wea-qulity"]/text()')

这里解释一下:

  1. text():输出节点下的所有内容

4. 放入表格`

天气分析

import requests
import pandas as pd
from lxml import etree
import re

url="http://tianqi.2345.com/today-71989.htm"
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36"
}
response=requests.get(url,headers=headers)
html=etree.HTML(response.text)
divs=html.xpath('//div[@class="seven-day"]')[0]
lis=divs.xpath('./ul/li/a')

dates=[]
weathers=[]
temps=[]
winds=[]
air_qua=[]
for li in lis[1:]:
    dates.append(li.xpath('./em/text()')[0])
    weathers.append(li.xpath('./i/text()')[0])
    temps.append(li.xpath('./span[@class="tem-show"]/text()')[0])
    winds.append(li.xpath('./span[@class="wind-name"]/text()')[0])
    air_qua.append(li.xpath('./span[@class="wea-qulity"]/text()')[0])
    
datas={"日期":dates,"天气":weathers,"温度":temps,"风力":winds,"空气质量":air_qua}    
pd.DataFrame(datas)

在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值