主页 分类 关于

爬虫 xpath(牢饭吃到饱)

每天一个入狱小技巧

xpath 是在XML文档中搜索内容的一门语言 可以用绝对定位和相对定位

html是xml的一个子集

安装xpath

打开cmd 输入以下内容

pip install xpath

xpath语法

主要分为3大类

层级: / 直接子集 跳级 斜杠隔开的是节点

属性: @ 属性访问 如//link/@href 从选中的节点标签中获取指定的值

函数: contains() 包含 text()文本 等... 如//title/text() 从开闭标签之间去文本内容

表达式 描述
nodename 选中该元素
/ 从根节点选取或者是元素和元素间的过度
// 从匹配选择的当前节点选择文档的节点而不用考虑它们的位置
@ 选取属性
. 选取当前节点
.. 选取当前节点的父节点
text() 选取文本

综合练习

打开这个网址

# 导入xpath
from lxml import etree

xml = """
<book>
<id>???</id>
<name>星际宝贝</name>
<price>!!!</price>
<nick>实验品</nick>
<author>
<nick id="624">安琪</nick>
<nick id="625">鲁本</nick>
<nick id="626">史迪奇</nick>
<nick class="221">小火花</nick>
<div>
<nick>搞破坏</nick>
</div>
<span>
<nick>吃饭</nick>
</span>
</author>

<partner>
<nick id="029">跳棋</nick>
<nick id="001">史灵可</nick>
</partner>
</book>
"""

tree = etree.HTML(html.text) #加载爬取下来的源码
# tree = etree.parse(paese) #加载文件
# tree = etree.XML(xml) #加载XML

result = tree.xpath("/book//nick/text().extract") #text()就是文字 .extract就是提取
print(result)

HTML代码 保存sdq.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body>
<ul>
<li><a href="http://www.baidu.com">百度</a></li>
<li><a href="http://www.google.com">谷歌</a></li>
<li><a href="http://www.sogou.com">搜狗</a></li>
</ul>
<ol>
<li><a href="Stitch">Stitch</a></li>
<li><a href="sdq">史迪奇</a></li>
<li><a href="sdz">史迪仔</a></li>
</ol>
<div class="Lilo">莉萝</div>
<div class="Nani">兰莉</div>
</body>
</html>

py代码

from lxml import etree

tree = etree.parse("sdq.html")
# result = tree.xpath('/html')
# result = tree.xpath("/html/body/ul/li/a/text()")
# result = tree.xpath("/html/body/ul/li[1]/a/text()") # xpath的顺序是从1开始数的, []表示索引
# result = tree.xpath("/html/body/ol/li/a[@href='dapao']/text()") # [@xxx=xxx] 属性的筛选
# print(result)

# ol_li_list = tree.xpath("/html/body/ol/li")

# for li in ol_li_list:
# # 从每一个li中提取到文字信息
# result = li.xpath("./a/text()") # 在li中继续去寻找 相对查找
# print(result)
# result2 = li.xpath("./a/@href") # @属性意思是拿到属性值
# print(result2)
#
# print(tree.xpath("/html/body/ul/li/a/@href"))
print(tree.xpath('/html/body/div[1]/text().extract')) #text()就是文字 .extract就是提取
print(tree.xpath('/html/body/ol/li/a/text().extract')) #text()就是文字 .extract就是提取

选取特定节点的语法

通过索引修饰节点

路径表达式 结果
//title[@lang=”eng”] 选择lang属性值为eng的所有title元素
/bookstore/book[1] 选择属于bookstore子元素的第一个book元素
/bookstore/book[last()] 选择属于bookstore子元素的最后一个book元素
/bookstore/book[last()-1] 选择属于bookstore子元素的倒数第二个book元素
/bookstore/book[position()>1] 选择bookstore下面的book元素从第二个开始选择
//book/title[text()=”sdq”] 选择所有book下的title元素仅仅选择文本为sdq的title元素
/bookstore/book[price>33.33] 选取bookstore元素中book元素的所有title元素且其中price元素的值必须大于33.33

通过属性值修饰节点

//div[@id="sdq"]/div/@id     出现在[]中@是使用标签属性名和属性值修饰节点 出现在结尾的/@是取属性值

通过子节点的值修饰节点

//span[i>333]   i是标签
//div[span[2]>9.3] span是标签

通过包含修饰

//div[contains(@id,"sd")]       找出sdq通过属性名和大概的属性值 
//div[contains(text(),"下一页")] 通过文本内容包含有下一页的字

选取未知节点的语法

通配符 描述
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点
//* 全部的标签
//@* 全部的属性

xpath复合使用语法

//h2/a|//td/a

xpath方法返回列表的三种情况

  • 返回空列表: 根据xpath语法规则字符串, 没有定位到任何元素

  • 返回由字符串构成的列表: xpath字符串匹配的一定是文本内容或某属性的值

  • 返回由Element对象构成的列表: xpath规则字符串匹配的是标签, 列表中的Element对象可以继续进行xpath










作者: 我叫史迪奇
本文来自于: https://sdq3.link/reptile-xpath.html博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议