xpath的基本使用:
Xpath的学习:
0.参考
https://www.w3.org/TR/xpath/
http://www.w3school.com.cn/xpath/index.asp
https://zhuanlan.zhihu.com/p/29436838
1.xPath的概念:
XML Path Language :
是一门语言,用于搜寻XML文档的,但是,也可以用于HTML文档的搜索
,在做爬虫的时候,会有人使用xPAth来做,相应信息的抽取..
2.xPath的基本语法:
'/':
从当前的节点,选取直接子节点
'//':
从当前节点选取子孙节点
'.':
选取当前的节点
'..':
选取当前节点的父节点
parent:: 也可以实现的...
'@':
选取属性
简单举例说明:
//title[@lang='eng']
标签名为title ,属性 lang的值为 eng
3.配饰安装环境:
安装LXML 库
4.代码案例:
Python文件:
from lxml import etree
'''
page = etree.HTML(html.lower().decode('utf-8'))
etree.parse直接接受一个文档,按照文档结构解析,就不用打开文件了
HTMLParser是python自带的网页解析工具
'''
html = etree.parse('./test.html', etree.HTMLParser())
#匹配所有的节点
result=html.xpath('//*')
#获取所有的li节点,返回的是一个数组(需要做一些处理的)
result1=html.xpath('//li')
print(result1)
#获取子节点
result2=html.xpath('//li/a')
print(result2)
#获取后代节点
result3 = html.xpath('//ul//a')
print(result3)
#通过子节点来获取父节点...
result4 = html.xpath('//a[@href="https://ask.hellobi.com/link4.html"]/../@class')
print(result4)
# 找父元素 为什么要使用 * 呢?? 搞不懂
result5=html.xpath('//a[@href="https://ask.hellobi.com/link4.html"]/parent::*/@class')
print(result5)
#匹配属性
result6=html.xpath('//li[@class="item-0"]')
print(result6)
#文本的获取:
result7=html.xpath('//li[@class="item-0"]/text()')
print(result7) #'/' 获取直接的子节点,所以没有内容的
result8=html.xpath('//li[@class="item-0"]/a/text()')
print(result8)
result9=html.xpath('//li[@class="item-0"]//text()')
print(result9)
#属性的获取
result10=html.xpath('//li/a/@href')
print(result10)
#一个属性的多个值 的匹配,就是有好几个class 我只匹配其中的一个( 用于匹配一个属性有多个值的情况 )
result11=html.xpath('//li[contains(@class, "li")]/a/text()')
print(result11)
#多个属性作为匹配条件
result12=html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')
print(result12)
# xpath的运算符 http://www.w3school.com.cn/xpath/xpath_operators.asp
#排序选择
result13 = html.xpath('//li[1]/a/text()') #选择器竟然不是从0 开始计数的
print(result13)
result14 = html.xpath('//li[last()]/a/text()') #获取最后一个元素
print(result14)
result15 = html.xpath('//li[position()<3]/a/text()') #获取di 1,2个元素
print(result15)
result16 = html.xpath('//li[last()-2]/a/text()') #last() 最后一个 last()-2 就是倒数第三个元素了...
print(result16)
#节点轴的选择
# 获取所有的祖先
result17=html.xpath('//li[1]/ancestor::*')
print(result17)
#获取div 祖先
result18=html.xpath('//li[1]/ancestor::div')
print(result18)
#获取所有的属性
result19=html.xpath('//li[1]/attribute::*')
print(result19)
#获取直接子节点,并且限制了属性
result20=html.xpath('//li[1]/child::a[@href="https://ask.hellobi.com/link1.html"]')
print(result20)
#获取 所有后代节点 中的span
result21=html.xpath('//li[1]/descendant::span')
print(result21)
#获取当前节点之后的所有节点( 不管是不是同级的,都会被选中的 )
result22=html.xpath('//li[1]/following::*[2]') #获取第二个后续节点
print(result22)
result24=html.xpath('//li[1]/following::*/span/text()')
print(result24)
#获取兄弟节点 之后的
result23=html.xpath('//li[1]/following-sibling::*')
print(result23)
html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<ul>
<li class="item-0"><a href="https://ask.hellobi.com/link1.html">first item <span>span content</span></a></li>
<li name="item" class="item-1 li"><a href="https://ask.hellobi.com/link2.html">second item</a></li>
<li class="item-inactive"><a href="https://ask.hellobi.com/link3.html">third item</a></li>
<li class="item-1"><a href="https://ask.hellobi.com/link4.html">fourth item</a></li>
<li class="item-0"><a href="https://ask.hellobi.com/link5.html">fifth item <span>为 貌</span></a>
</ul>
</div>
</body>
</html>
5.谷歌浏览器 xPath helper的使用:
1.ctrl+shift+x
shift + 左键选中对应的块
2.f12 开发者工具中
右击,copy copy xpath
3.有利有弊
都是从根目录开始,比较冗长...