xpath 和 在 lxml 中应用 (做个小笔记)

#xpath
#xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历。
#1.用法

'''
 /                        代表逐层提取                实例   提取标题                             /html/head/title
 text()                   提取标签下的文本             实例   提取标题文本                         /html/head/title/text()
 //标签名                  提取所有名为**的标签          实例   提取所有div标签                     //div
 //标签名[@属性=‘属性值’]    提取属性名为**的标签          实例 提取div中<div class="tools">标签内容      //div[@class="tools"]/text()
 @属性名                   代表某个属性名               实例  提取新_我的订单  //ul[@class="ddnewhead_gcard_list"]/li/a/@dd-name

'''
'''
路径用法
谓语
   /li/a[1]              即选取属于 li 标签下 第一个 a元素
   /li/a[last()]         即选取属于 li 标签下 最后一个 a元素
   /li/a[last()-1]       即选取属于 li 标签下 倒数第二个 a元素   
   /li/a[position()<3]   即选取属于 li 标签下 前两个 a元素
   /li/a[price>35.00]   即选取属于 li 标签下 a元素中pprice大于的元素
'''
'''
通配符
    *       匹配任意节点
    @*      匹配任意节点中的任何属性
    |       选取多个路径      /li/a | /li/a/text()   选取所有 a元素  和 a元素下的文本信息
'''

#2.lxml    lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
from lxml import html
text = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </ul>
 </div>
'''
# 将字符串解析为html文档
txt =html.etree.HTML(text)
print(txt)           #type  为  <class 'lxml.etree._Element'>
# 按字符串序列化html  tostring
result = html.tostring(txt).decode('utf-8')
print(result)     #type  为  str

'''#从文件中提取
txt=html.etree.parse('文件名')
result=html.etree.tostring(txt).decode('utf-8')
print(result)'''
# xpath 在 lxml 中应用
from lxml import html
text='''
<html><body><p>html
<!-- hello.html -->
</p><div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div></body></html>
'''
#txt=html.etree.HTML(text)
#result=html.etree.tostring(txt).decode('utf-8')
#print(result)

txt=html.etree.HTML(text)
#1. 获取所有li标签:       这个可以不重要理解吧 好像一般都用不了
result=txt.xpath('//ul/li')
'''这里的的txt必须是html 的 格式 才能用xpath提取        得到的是一个列表'''
''''  得到的像这样   <Element li at 0x2d414722188> 是一个元素,它的类型是'lxml.etree._Element'  需要用 html.tostring()  取出内容
    因为这个标签下有很多内容  所以返回的是这个   如果路径具体的话就不会是这个 而是具体的内容  '''
for i in range(0,len(result)):
    realresult = html.tostring(result[i]).decode('utf-8')
    print(realresult)

#2. 获取所有li元素下的所有class属性的值:
result=txt.xpath('//ul/li/@class')
print(result)
#3. 获取li标签下href为link2.html的a标签:
result=txt.xpath('//ul/li[2]/a/@href')   #也可以  '//ul/li[@class="item-1"][1]/a/@href'
print(result)
#4. 获取li标签下所有span标签:
result=txt.xpath('//ul/li/a/span')
print(result)
#5. 获取li标签下的a标签里的所有class:
result=txt.xpath('//ul/li/a//@class')
print(result)
#6. 获取最后一个li的a的href属性对应的值:
result=txt.xpath('//ul/li[last()]/a/@href')
print(result)
# 7. 获取倒数第二个li元素的内容:
result=txt.xpath('//ul/li[last()-1]/a')
print(result[0].text)                         #因为得到的 列表 所以 第一个元素 即为所求
#8. 获取倒数第二个li元素的内容的第二种方式:
result=txt.xpath('//ul/li[last()-1]/a/text()')
print(result)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值