解析库之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属性