先上一段代码,然后下边有详细介绍
注:先安装依赖包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。
-
在你想爬取的网页上按“F12”(以谷歌浏览器为例)
-
知道你需要爬取的内容,复制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
-
选取节点(常用)
表达式 描述 示例 解释 nodename 选取此节点的所有子节点 xpath("//div\")
选取了div节点的所有子节点 / 从根节点选取 xpath("/div")
从根节点上选取div节点 // 从匹配选择的当前节点选择文档中的节点 xpath("//div")
选取所有的div节点 . 选取当前节点 xpath("./div")
选取当前节点下的div节点 … 选取当前节点的父节点 xpath("..")
回到上一个节点 @ 选取当前节点的父节点 xpath("//@calss")
选取所有的class属性 -
谓词:被嵌在方括号内,用来查找某个特定的节点或包含某个制定的值的节点
表达式 解释 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节点 -
功能函数:使用功能函数能够更好的进行模糊搜索
函数 用法 解释 starts-with xpath("//div[starts-with(@id,'ma')]")
选取id值以ma开头的div节点 contains xpath("//div[contains(@id,'ma')]")
选取id值包含ma的div节点 and xpath("//div[contains(@id,'ma') and contains(@id,'in')]")
选取id值包含ma和in的div节点 text() xpath("//div[contains(text(),'ma')]")
选取节点文本包含ma的div节点 -
通配符:Xpath通过通配符来选取未知的XML元素
表达式 结果 xpath("/div/*")
选取div下的所有子节点 xpath("/div[@*]")
选取所有带属性的div节点 -
取多个路径:使用“|”运算符可以选取多个路径
表达式 结果 xpath("//div|//table")
选取所有的div和table节点 -
Xpath轴:轴可以定义相对于当前节点的节点集
名称 表达式 描述 ancestor xpath("./ancestor::*")
选取当前节点的所有先辈节点(父、祖父) ancestor-or-self xpath("./ancestor-or-self::*")
选取当前节点的所有先辈节点以及节点本身 attribute xpath("./attribute::*")
选取当前节点的所有属性 hild xpath("./child::*")
返回当前节点的所有子节点 descendant xpath("./descendant::*")
返回当前节点的所有后代节点(子节点、孙节点) following xpath("./following::*")
选取文档中当前节点结束标签后的所有节点 following-sibing xpath("./following-sibing::*")
选取当前节点之后的兄弟节点 parent xpath("./parent::*")
选取当前节点的父节点 preceding xpath("./preceding::*")
选取文档中当前节点开始标签前的所有节点 preceding-sibling xpath("./preceding-sibling::*")
选取当前节点之前的兄弟节点 self xpath("./self\::*")
选取当前节点