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

(3)找出div节点下的a标签,因为数据明细都集中在这个a标签下
lis=divs.xpath('./ul/li/a')
这里解释一下:
.:表示从当前节点开始(.相当于//div[@class="seven-day"])/:表示下一个节点(必须父子节点,不能跨节点)
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()')
这里解释一下:
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)

本文介绍如何使用XPath抓取天气2345网站上一周内的天气数据,包括日期、天气状况、温度范围等,并通过Python将数据整理成表格形式。
22万+





