python爬虫第八讲 - xpath

xpath的概述

  • 简单来说xpath就是一种可以根据地址找到人的技术
  • xpath(XML Path Language)可以在树状结构中寻找节点,可以通过元素和属性导航
  • 它可以用来1. 解析网页 2. 不同网页结构不一样,所以我们灵活的采用更加适合这个网页的解析技术 3. 网页结构明显,可以采用xpath

解决问题

可以通过lxml1将html2转换成xml3来解析

节点的关系

在这里插入图片描述
在这里插入图片描述

  • 父(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)

思路分析

  1. 第一步 页面分析
    1. 确定目标url
    2. 页面结构
    3. 实现步骤
      1. 拿到网页的源码
      2. 把网页源码生成一个element对象
      3. 通过element对象实现xpath语法进行数据的爬取 title url quote…
      4. 保存数据 先保存到字典里面 再添加到列表里面
      5. 把列表中的数据保存到csv文件当中搞定
  2. 第二步 代码实现

实现步骤

#!/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)

  1. html 超文本标记语言 ↩︎

  2. xml 可扩展标记语言 ↩︎

  3. lxml 是Python的一个第三方的库 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yerennuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值