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)