爬虫 xpath(牢饭吃到饱)
每天一个入狱小技巧
xpath 是在XML文档中搜索内容的一门语言 可以用绝对定位和相对定位
html是xml的一个子集
安装xpath
打开cmd 输入以下内容
xpath语法
主要分为3大类
层级: / 直接子集 跳级 斜杠隔开的是节点
属性: @ 属性访问 如//link/@href 从选中的节点标签中获取指定的值
函数: contains() 包含 text()文本 等... 如//title/text() 从开闭标签之间去文本内容
|
表达式 |
描述 |
nodename |
选中该元素 |
/ |
从根节点选取或者是元素和元素间的过度 |
// |
从匹配选择的当前节点选择文档的节点而不用考虑它们的位置 |
@ |
选取属性 |
. |
选取当前节点 |
.. |
选取当前节点的父节点 |
text() |
选取文本 |
综合练习
打开这个网址
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)
result = tree.xpath("/book//nick/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")
print(tree.xpath('/html/body/div[1]/text().extract')) print(tree.xpath('/html/body/ol/li/a/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复合使用语法
xpath方法返回列表的三种情况
返回空列表: 根据xpath语法规则字符串, 没有定位到任何元素
返回由字符串构成的列表: xpath字符串匹配的一定是文本内容或某属性的值
返回由Element对象构成的列表: xpath规则字符串匹配的是标签, 列表中的Element对象可以继续进行xpath
作者: 我叫史迪奇
本文来自于:
https://sdq3.link/reptile-xpath.html博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议