xpath语法和lxml库的学习

xpath语法

谓语表达式[]

  • [@class='shop']根据属性筛选,只有一个属性值
  • [contains(@class,'shop')] contains函数筛选,可以有多个属性值
  • [contains(@class,'shop') and @name='item'] 多个属性
  • [positon<3]
  • [first()]
  • [last()]等等

lxml库中常见的类和方法

  • <class 'lxml.etree._Element'>

    • 直接把html文本传入HTML()函数中获得的对象
  • <class 'lxml.etree._ElementTree'>

    • 利用parse()函数传入有路径的文件获得的对象

ps:自己也不知道这两个有什么不同,但是都可以用

  • xpath() 返回对象为列表

通过xpath语法使用lxml库解析HTML的步骤

  1. 构造节点树对象

  2. 思考如何选取节点?节点的路径是什么?

  3. xpath()函数选取节点,返回列表

以下内容参照博客练习:https://cuiqingcai.com/5545.html

from lxml import etree
text = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </ul>
 </div>
'''
html = etree.HTML(text)
html2=etree.parse(r"E:\360MoveData\Users\hzsdl\Desktop\[Python3网络爬虫开发实战] 4.1-使用XPath _ 静觅.html",parser=etree.HTMLParser())
print(type(html))
#<class 'lxml.etree._Element'>
#print(type(html2))
#<class 'lxml.etree._ElementTree'>
result=etree.tostring(html)
#print(type(result))
#<class 'bytes'>
print(result.decode('utf-8'))

#所有节点,返回列表
result = html.xpath('//*')
print(result)

#子孙节点和子节点
result = html.xpath('//li/a')
result=html.xpath('//ul/a') #空的列表
result=html.xpath('//ul/li/a')#/直接选取子节点,//选取子孙节点
print(result)

#先获取子节点再获取父节点
result = html.xpath('//a[@href="link4.html"]/../@class')
print(result)

#节点的选择:根据属性选择,[]为谓词表达式
result = html.xpath('//li[@class="item-0"]')
print(result)

#选取文本
result = html.xpath('//li[@class="item-0"]/text()')#节点内部节点的文本不算节点的文本
result = html.xpath('//li[@class="item-0"]/a/text()')
print(result)

#节点属性获取
result = html.xpath('//li/a/@href')
print(result)

#属性多值获取,contains函数,属性和属性值
result = html.xpath('//li[contains(@class, "li")]/a/text()')
print(result)

#多属性获取
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
print(result)

#根据位置和顺序选择节点,[]谓词表达式
html = etree.HTML(text)
result = html.xpath('//li[1]/a/text()')
print(result)
result = html.xpath('//li[last()]/a/text()')
print(result)
result = html.xpath('//li[position()<3]/a/text()')
print(result)
result = html.xpath('//li[last()-2]/a/text()')
print(result)

猜你喜欢

转载自www.cnblogs.com/lzycodinglife/p/12599800.html
今日推荐