一、简介: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::*')

 

posted on 2020-07-01 04:01  焚音留香  阅读(131)  评论(0编辑  收藏  举报