解析库之Xpath解析器

xpath解析器

模拟文本

doc = '''
<html>
 <head>
  <base href='http://example.com/' />
  <title id='t1'>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html' a="xxx">Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html' class='li'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
   <a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a>
  </div>
 </body>
</html>
'''

导入xpath模块

from lxml import xpath

生成对象

html=etree.HTML(doc) 括号内部放入带传入的文本 类似于soup=BeautifulSoup(res.text,'lxml')

1.所有节点

a = html.xpath('//*')  匹配所有的标签

  2 指定某个节点 结果是列表 该文本只有一个head标签,所以匹配内容只有一个

a=html.xpath('//head') 匹配所有head标签

3.a = html.xpath('//div/a') # 匹配div标签内部所有的儿子a标签

   a = html.xpath('//body//a') # 匹配div标签内容所有的后代a标签

/和//的区别就在于一个是只寻找儿子a标签,一个是找寻所有的后代a标签

4.属性查找

a=html.xpath('//body//a[@href="image1.html"]')  #匹配body内部所有后代属性为href=image1.html的a标签 []和@不能省略

a = html.xpath'//body//a[@href="image1.html"]/..')# 匹配body内部所有后代属性为href=image1.html的a标签的父标签..就是当前标签的父标签符号   

5.父标签查找

a = html.xpath('//title[@id="t1"]/..')   #匹配所有title属性为id=t1的父标签

 

6.索引取值

a = html.xpath('//body//a[1]') #匹配body内部第一个a标签 需要注意xpath解析器是从1开始的


文本获取

a = html.xpath('//body//a[@href="image1.html"]/text()') 

匹配body内部所有属性为href=image1.html的a标签中的文本内容


 a = html.xpath('//body//a/text()')

匹配body内部所有后代a标签的text文本内容,一次性获取所有文本内容,不需要再进行for循环获取(重要)


 

a = html.xpath('//body//a/@href') 

匹配所有body内部后代a标签的href属性,比如可以一下子获得所有网址,图片地址等


 

a = html.xpath('//title/@id') 

匹配所有title的id属性值


 

a = html.xpath('//body//a[2]/@href')

匹配body内部第二个a标签的属性,比如你可以获取a标签的第二个网址,图片地址等


 

a=html.xpath('//body//a[@class="li"]')

匹配body内部中的class=li标签的a标签,=号一定是等于不是包含,


 

a = html.xpath('//body//a[contains(@class,"li")]/text()') 

如果需要包含须加上contains关键字


 

a = html.xpath('//body//a[contains(@class,"li") or @name="items"]')

匹配所有body内部包含class=li或者name=items的a标签,


 

a = html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')

匹配是所有body内部包class=li并且name=items的a标签中的文本内容


 

a = html.xpath('//a[last()]/@href')

匹配最后一个a标签中的href属性


 

a = html.xpath('//a[position()<3]/@href')

匹配位置小于3的a标签中的href属性position()为关键字


 

a = html.xpath('//a[last()-2]/@href')

匹配位置在倒数第三个的a标签中的href属性

 

posted @ 2021-09-27 15:38  查无此人cxc  阅读(104)  评论(0编辑  收藏  举报