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的步骤
-
构造节点树对象
-
思考如何选取节点?节点的路径是什么?
-
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:360MoveDataUsershzsdlDesktop[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)