3.xpath

2018-10-31  本文已影响0人  学飞的小鸡
# pip install lxml
from lxml import etree

# xpath 是一种语法, 可以在xml文件中根据文档结构提取出目标内容(html是一种特殊的xml)
# lxml 库用于分析和提取xml文件中内容, etree是lxml里面的一个工具,用于把一个xml文件,
   # 解析成一个树形结构(层级结构)


# 1. 用etree把整个html字符串加载出来,生成一颗节点数

html_tree = etree.parse('./test.html')
print(html_tree)  # <lxml.etree._ElementTree object at 0x000001476136F808>

# 2. 根据树形结构获取目标节点
# ret = html_tree.xpath('/html/body/ol/li')  # 所有的li
ret = html_tree.xpath('/html/body/ol/li[1]')  # 第一个li
# ret = html_tree.xpath('/html/body/div/div[2]/a')

# 3. 找节点中的内容与属性
ret = html_tree.xpath('/html/body/div/ol[1]/li[1]/text()')
# ret = html_tree.xpath('/html/body/div/ol[1]/li/text()')
# ret = html_tree.xpath('/html/body/div/ol/text()')  # ['\n\t\t\t', '\n\t\t\t', '\n\t\t\t', '\n\t\t', '\n\t\t\t', '\n\t\t\t', '\n\t\t']

# xpath语法中节点的属性需要@符号来修饰
ret = html_tree.xpath('/html/body/div/div[2]/a/@href')

# 以网页源码为标准
ret = html_tree.xpath('//div/a/img/@src2')
print(ret)


# 4. 定位
# 1> 层级定位 '/'代表节点前面有一层, '//'代表有若干层
ret = html_tree.xpath('//li/text()')

# 2> 属性定位
# 获取页面中有id属性的li
ret = html_tree.xpath('//li[@id]')

# 获取所有的class值为hehe的li
ret = html_tree.xpath('//li[@class="hehe"]')

# 如果一个节点有多个属性一定要把这些值写全
ret = html_tree.xpath('//li[@class="haha pp"]')

# 模糊匹配
# 所有class值以h开头的li
ret = html_tree.xpath('//li[starts-with(@class,"h")]')
# 所有class值中含有a的li
ret = html_tree.xpath("//li[contains(@class, 'a')]")

# ends-with匹配结尾,有的版本已废弃
# ret = html_tree.xpath("//li[ends-with(@class,'a')]")


# 逻辑运算
# 查找所有class值为hehe并且id值为tata的li
ret = html_tree.xpath("//li[@class='hehe' and @id='tata']")

# 查找所有的class值为hehe或者含有a的
ret = html_tree.xpath("//li[@class='hehe' or contains(@class, 'a')]")




obj = html_tree.xpath("//div[@id='pp']")[0]
# print(obj)
# 以obj为跟, 继续向内部查找
ret = obj.xpath("//li/text()")  # 无论以谁根,只要以//开头都以html为根

ret = obj.xpath(".//li/text()")


print(ret)
上一篇 下一篇

猜你喜欢

热点阅读