Xpath库的用法总结

文章目录

      • 一.初始化
        • 1.读取字符串初始化
        • 2.读取文本文件初始化
      • 二.查找节点
        • A.标签匹配
          • 1.所有节点: //* 可通过下标索引选择对应的节点
          • 2.选取特定子节点: //li/a //li//a ; /只用于获取子节点, //用于获取所有子孙节点
        • B.属性匹配
          • 1.属性匹配
          • 2.属性多值匹配:通过contains(@class,"key")即可筛选出包含key的标签
          • 3.多属性匹配:若多个属性匹配一个节点,可以通过and来并列,如@class="item-0" and @name="li"
        • C.关系匹配
          • 1.按序选择节点: [1]:选择第一个节点, [last( )]:选择最后一个节点, [position() < 3 ]:前两个节点
          • 2.选取父节点:使用..或者parent::
          • 3.节点轴选择
      • 三.获取信息
        • 1.获取文本:不会获得html标签文本,且使用/只会获得当前标签内的字符串, //会获得该标签子孙内的所有字符串
        • 2.属性获取:直接加上/@class即可获得当前标签的属性值

一.初始化

1.读取字符串初始化

from lxml import etree

text = '''
  • first item
  • second item
'''
print("读取字符串") # 将text的HTML文本构造成一个xpath对象 html = etree.HTML(text) # 对html文本进行修正,生成为一个标准的html格式文本 result = etree.tostring(html) # 输出文本,由于修正后的html文本是比特类型的,需要进行编码,为str类型 print(result.decode('utf-8'))

2.读取文本文件初始化

print("读取文本文件")
html = etree.parse('text.html', etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))

二.查找节点

A.标签匹配

1.所有节点: //* 可通过下标索引选择对应的节点
print("所有节点")
result = html.xpath('//*')
print(result)
2.选取特定子节点: //li/a //li//a ; /只用于获取子节点, //用于获取所有子孙节点
print("选取子节点")
result = html.xpath('//li/a')
print(result)

B.属性匹配

1.属性匹配
print("属性匹配")
result = html.xpath('//li[@class="item-0"]')
print(result)
2.属性多值匹配:通过contains(@class,“key”)即可筛选出包含key的标签
print("属性多值匹配")
result = html.xpath('//li[contains(@class,"item-1")]')
print(result)
3.多属性匹配:若多个属性匹配一个节点,可以通过and来并列,如@class=“item-0” and @name=“li”
print("多属性匹配一个节点")
result = html.xpath('//li[contains(@class,"item-1") and @name="li"]//text()')
print(result)

C.关系匹配

1.按序选择节点: [1]:选择第一个节点, [last( )]:选择最后一个节点, [position() < 3 ]:前两个节点
# 会选择同一级别相应位置的所有节点

print("按序选择节点")
result = html.xpath('//li[position()<3]/text()')
print(result)
2.选取父节点:使用…或者parent::
print("选取父节点")
result1 = html.xpath('//a[@href="link4.html"]/../@class')
result2 = html.xpath('//a[@href="link4.html"]/parent::*/@class')
print(result1, result2)
3.节点轴选择
# ancestor:所有祖先节点

print("祖先节点")

result = html.xpath('//li[1]/ancestor::div[@id="container1"]')

print(result)

# attribute:所有属性

print("所有属性")

result = html.xpath('//li[1]/attribute::*')

print(result)

# child:所有的直接子节点

print("所有的直接节点")

result = html.xpath('//li[2]/child::*')

print(result)

# descendant:所有的子孙节点

print("所有子孙节点")

result = html.xpath('//ul/descendant::a/text()')

# //ul只会选择第一个ul,而li[1]会选择同级别所有第一个li标签

print(result)

# following:当前节点后的所有节点

print("当前节点后的所有节点")

result = html.xpath('//li[1]/following::*/text()')

print(result)

# following-sibling:当前节点后所有同级节点

print("当前节点后的所有节点")

result = html.xpath('//li[1]/following-sibling::*//text()')

print(result)

三.获取信息

1.获取文本:不会获得html标签文本,且使用/只会获得当前标签内的字符串, //会获得该标签子孙内的所有字符串

print("获取文本")
result = html.xpath('//li[@class="item-1"]/text()')
print(result)

2.属性获取:直接加上/@class即可获得当前标签的属性值

print("属性获取")
result = html.xpath('//div[@id="container1"]//li/@class')
print(result)

你可能感兴趣的:(#,Python爬虫)