Loading...
墨滴

公众号:uncle39py

2021/12/29  阅读:33  主题:默认主题

xpath

xpath选择器

xpath是一个在XML、html文档中查找标签的工具,它的在爬虫体系中的作用与BeautifulSoup相同。

使用时需要用到lxml解析器

from lxml import etree

html = etree.HTML(doc)

# 以此str作为例子
doc='''
<html>
 <head>
  <base href='http://example.com/' />
  <title>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html' aa='bb'>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'>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>
'''

from lxml import etree

html = etree.HTML(doc)

通篇只要记住这4句,其他看个乐呵就行:

// 表示不管位置直接找,返回列表

/ 表示从根节点选取,返回列表;

/text() 获取文本

/@属性 获取属性,比如/@href

# 1 找所有节点
res = html.xpath('//*'
#返回的是列表套一个个对象:[<Element html at 0x202a57cf288>, <Element head at 0x202a57cf208>, <Element base at 0x202a57cf1c8>, ...]
  
# 2 指定节点查找,返回列表
res = html.xpath('//head')  # [<Element head at 0x2a4bef8f208>]
  
# 3 
res = html.xpath('//div/a')  # 任意一个div节点下的a标签,这里的a是紧邻的子节点
res = html.xpath('//body/a'# 无数据,因为body下没有直接的子节点a,通过//body//a才能找到body下的孙子节点a
  
# 4 属性匹配
res=html.xpath('//body//a[@href="image1.html"]')  # 找到href属性是这样的a
res=html.xpath('//body//a[1]')  # 找到第一个a
  
# 5 /text() 取当前标签的文本,重要
res = html.xpath('//body//a[@href="image1.html"]/text()')  # ['Name: My image 1 ']
res = html.xpath('//body//a/text()')  # ['Name: My image 1 ', 'Name: My image 2 ', 'Name: My image 3 ', ...]
  
# 6 /@属性,取当前标签的属性,比如/@href 
res = html.xpath('//body//a/@href'# ['image1.html', 'image2.html', 'image3.html',...]
  
# 7 []过滤属性或者索引
res = html.xpath('//body//a[@class="li"]')  # 取类等于li的a标签,需要完全匹配才能被过滤出来
res = html.xpath('//body//a[contains(@class,"li")]')  # 类包含li
res = html.xpath('//body//a[contains(@class,"li")]/text()')
  
# 8 last()
res = html.xpath('//a[last()]/@href')  # 取最后一个a的href属性

其余的太过繁琐冗长,拷下来有需要的时候查查,基本用不到

# 位置小于3的
res = html.xpath('//a[position()<3]/@href')
# 倒数第二个
res = html.xpath('//a[last()-2]/@href')

# 节点轴选择
# ancestor:祖先节点
# 使用了* 获取所有祖先节点
res = html.xpath('//a/ancestor::*')
# 获取祖先节点中的div
res = html.xpath('//a/ancestor::div')
# attribute:属性值
res = html.xpath('//a[1]/attribute::*')
res = html.xpath('//a[1]/@aa')
# child:直接子节点
res = html.xpath('//a[1]/child::*')
res = html.xpath('//a[1]/child::img/@src')
# descendant:所有子孙节点
res = html.xpath('//a[6]/descendant::*')
res = html.xpath('//a[6]/descendant::h5/text()')
# following:当前节点之后所有节点(兄弟节点和兄弟内部的节点)
res = html.xpath('//a[1]/following::*')
res = html.xpath('//a[1]/following::*[1]/@href')

公众号:uncle39py

2021/12/29  阅读:33  主题:默认主题

作者介绍

公众号:uncle39py