Python爬虫 - xpath的用法

先上一段代码,然后下边有详细介绍
注:先安装依赖包lxml :pip install lxml

import requests
from lxml import etree

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'
}

#获取并解析网页
wb_data = requests.get('https://blog.csdn.net/weixin_44110998/article/details/97616526', headers=headers)
wb_data.encoding = wb_data.apparent_encoding
dom = etree.HTML(wb_data.text)

#打印博客名和作者
title = dom.xpath('//*[@id="mainBox"]/main/div[1]/div[1]/div/div[1]/h1/text()')
time = dom.xpath('//*[@id="mainBox"]/main/div[1]/div[1]/div/div[2]/div[1]/span[1]/text()')
print('标题:',title[0])
print('时间:',time[0])

一、获取xpath

这一点是重中之重,不同的 xpath路径写法会后续爬取代码会产生很大影响,而且不同的 xpath写法的稳定性也不同,接下来介绍如何简单的获取xpath。

  1. 在你想爬取的网页上按“F12”(以谷歌浏览器为例)
    在这里插入图片描述

  2. 知道你需要爬取的内容,复制xpath(爬取文章标题和时间)

    找到需要爬取的内容,鼠标右击 > Copy > Copy XPath
    示例:
    标题://*[@id="mainBox"]/main/div[1]/div[1]/div/div[1]/h1
    时间://*[@id="mainBox"]/main/div[1]/div[1]/div/div[2]/div[1]/span[1]

    在这里插入图片描述

二、基本语法和实际操作

在(一)中介绍了如何简便的获取,接下来介绍一下基本语法,方便修改xpath

  1. 选取节点(常用)

    表达式描述示例解释
    nodename选取此节点的所有子节点xpath("//div\")选取了div节点的所有子节点
    /从根节点选取xpath("/div")从根节点上选取div节点
    //从匹配选择的当前节点选择文档中的节点xpath("//div")选取所有的div节点
    .选取当前节点xpath("./div")选取当前节点下的div节点
    选取当前节点的父节点xpath("..")回到上一个节点
    @选取当前节点的父节点xpath("//@calss")选取所有的class属性
  2. 谓词:被嵌在方括号内,用来查找某个特定的节点或包含某个制定的值的节点

    表达式解释
    xpath("/body/div[1]")选取body下的第一个div节点
    xpath("/body/div[last()]")选取body下最后一个div节点
    xpath("/body/div[last()-1]")选取body下倒数第二个div节点
    xpath("/body/div[positon()< 3]")选取body下前两个div节点
    xpath("/body/div[@class]")选取body下带有class属性的div节点
    xpath("/body/div[@class='main']")选取body下class属性为main的div节点
    xpath("/body/div[price>35.00]")选取body下price元素值大于35的div节点
  3. 功能函数:使用功能函数能够更好的进行模糊搜索

    函数用法解释
    starts-withxpath("//div[starts-with(@id,'ma')]")选取id值以ma开头的div节点
    containsxpath("//div[contains(@id,'ma')]")选取id值包含ma的div节点
    andxpath("//div[contains(@id,'ma') and contains(@id,'in')]")选取id值包含ma和in的div节点
    text()xpath("//div[contains(text(),'ma')]")选取节点文本包含ma的div节点
  4. 通配符:Xpath通过通配符来选取未知的XML元素

    表达式结果
    xpath("/div/*")选取div下的所有子节点
    xpath("/div[@*]")选取所有带属性的div节点
  5. 取多个路径:使用“|”运算符可以选取多个路径

    表达式结果
    xpath("//div|//table")选取所有的div和table节点
  6. Xpath轴:轴可以定义相对于当前节点的节点集

    名称表达式描述
    ancestorxpath("./ancestor::*")选取当前节点的所有先辈节点(父、祖父)
    ancestor-or-selfxpath("./ancestor-or-self::*")选取当前节点的所有先辈节点以及节点本身
    attributexpath("./attribute::*")选取当前节点的所有属性
    hildxpath("./child::*")返回当前节点的所有子节点
    descendantxpath("./descendant::*")返回当前节点的所有后代节点(子节点、孙节点)
    followingxpath("./following::*")选取文档中当前节点结束标签后的所有节点
    following-sibingxpath("./following-sibing::*")选取当前节点之后的兄弟节点
    parentxpath("./parent::*")选取当前节点的父节点
    precedingxpath("./preceding::*")选取文档中当前节点开始标签前的所有节点
    preceding-siblingxpath("./preceding-sibling::*")选取当前节点之前的兄弟节点
    selfxpath("./self\::*")选取当前节点
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值