一、简介:xpath是python自带的用于在xml文档中查找信息的方法
二、准备文档,解析器对象
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 # 用parse方法生成lxml的解析器对象,需要传入html文件,并且声明解析器 html_0 = etree.parse('search.html', etree.HTMLParser()) # 用HTML方法生成解析器对象,直接传入xml文档即可 html = etree.HTML(doc)
三、xpath语法:
1、特点:
①以单斜杠或双斜杠为基础
②查找结果多为列表,可以用列表的相关方法取出指定信息
2、基本使用:
①< / >:单斜杠,查找范围只是儿子标签
②< // >:双斜杠,查找范围是所有后代
③< ./ > / < .// >:当前标签起手
④示例:
# 所有标签 tag_all_list = html.xpath('//*') # head标签 tag_head_list = html.xpath('//head') # body标签内的a标签 tag_a_list = html.xpath('//body//a') # div标签内的儿子级别的a标签 tag_a_list_2 = html.xpath('//div/a')
3、查找父标签:
# /..代表上一级 tag_a_parent = html.xpath('//body//a[1]/..') # /parent 同理,::* 代表匹配所有,但是父标签一般就是唯一的 tag_a_parent_2 = html.xpath('//body//a[1]/parent::*')
4、属性匹配:
# @属性名=属性值 tag_a = html.xpath('//body//a[@href="image1.html"]')
5、文本获取:
# /text() tag_a_1_text_list = html.xpath('//body//a[1]/text()') tag_a_text_list = html.xpath('//body//a/text()')
6、属性获取:
# @属性名 tag_a_href_list = html.xpath('//body//a/@href')
7、属性包含匹配:
# contains(@属性名,属性值) tag_a = html.xpath('//body//a[contains(@class,"li")]')
8、属性组合匹配:
# 用or或者and连接多条件 tag_a_1 = html.xpath('//body//a[contains(@class,"li") or @name="items"]') tag_a_2 = html.xpath('//body//a[contains(@class,"li") and @name="items"]')
9、按序选择:
# []内的数字并不等同于列表的索引,此处的[1]就是代表第一个,可以理解为写在字符串里面,就不再是列表索引 tag_a_1 = html.xpath('//a[1]') # 获取最后一个 tag_a_2 = html.xpath('//a[last()]') # 倒数第二个 tag_a_3 = html.xpath('//a[last()-1]') # 位置小于3的,即第一个和第二个 tag_a_4 = html.xpath('//a[position()<3]/@href')
10、其他:
# ancestor 获取祖先标签 tag_a_ancestor_div = html.xpath('//a/ancestor::div') # attribute 获取属性值 tag_a_href_1 = html.xpath('//a[1]/attribute::href') # 效果同上 tag_a_href_2 = html.xpath('//a[1]/@href') # child 获取儿子标签 tag_a_child = html.xpath('//a[1]/child::img') # descendant 获取后代标签 tag_div_descendant_br = html.xpath('//div[@id="images"]/descendant::br') # following 获取兄弟标签及兄弟标签的后代 tag_a_following = html.xpath('//a[1]/following::*') # following-sibling 只获取兄弟标签本身 tag_a_following_sibling = html.xpath('//a[1]/following-sibling::*')