学习日记—lxml库与Xpath提取网页数据总结


活动地址:CSDN21天学习挑战赛

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰!

一、lxml库与Xpath提取网页数据流程

        html字符串(python)经过lxml解析得到HTML页面,HTML页面经过xpath提取得到网页数据

二、浅入lxml库

1、安装:

        lxml是python的第三方库,需要在cmd命令框运行下面代码进行安装,当然,也可以在pycharm的终端框运行下面代码进行安装。

pip install lxml

2、简单介绍

        lxml是一款高性能的python HTML、XML解析器,主要功能就是解析和提取XML和HTML中的数据,也可以利用Xpath语法来定位特定的元素及节点信息。

3、解析HTML网页

        ①案例:HTML字符串的解析(小y觉得我们在爬虫时更多的是对html字符串进行解析)

代码:

from lxml import etree  # 导入模块

# HTML字符串
html_text = '''
<html><body>
    <div class="key">
        <div class="name">小y</div>
        <div class="age">不详</div>
        <div class="address">不详</div>
    </div>
</body></html>
'''
# 开始初始化
html = etree.HTML(html_text)  # 这里需要传入一个html形式的字符串
print(html)
print(type)
# 将字符串序列化为html字符串
result = etree.tostring(html).decode('utf-8')
print(result)
print(type(result))

运行结果:

         ②案例:读取解析HTML文件

        在同级文件夹下创建一个HTML文件

 代码:

from lxml import etree

# 将html文件进行读取
html = etree.parse('html文件.html')  # 此处为刚才创建好的html文件名称

# 将html内容序列化
result = etree.tostring(html).decode('utf-8')
print(result)
print(type(result))
html = etree.HTML(result)  # 这里需要传入一个html形式的字符串
print(html)
print(type)

运行结果:

小y觉得二者的表层区别也就是etree后面使用的方法不同。

三、浅尝Xpath

        Xpath(XML Path Language)是一门可以在XML文档中查找信息的语言,可以用来在XML文档中对元素和属性进行遍历。(HTML可以说是XML的子集,所以Xpath自然也适用于HTML)。

1、选取节点

        常用的路径表达式:

表达式说明
nodename选取此节点的所有子节点。
/从根节点选取。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点。
..选取当前节点的父节点。
@选属性节点。

        案例:

表达式说明
bookstore选取bookstore元素的所有子节点。
/bookstore选取根元素bookstore。(如果路径起始于正斜杠/,则此路径始终代表到某元素的绝对路径。)
bookstore/book选取属于bookstore的子元素的所有book元素。
//book选取所有book子元素,不管他们在文档中的位置。
bookstore//book选取属于bookstore元素的后代所有book元素,而不管它们位于bookstore之下的什么位置。
//@lang选取名为lang的所有属性。

2、谓语(用来查找某个特定的节点或者包含某个特定的值的节点,被嵌在方括号中)

        案例:

路径表达式结果
/bookstore/book[1]选取属于bookstore子元素的第一个book元素。
/bookstore/book[last(1)]选取属于bookstore子元素的最后一个book元素。
/bookstore/book[last()-1]选取属于bookstore子元素的倒数第二个book元素。
/bookstore/book[position()<3]选取前面两个属于bookstore元素的子元素的book元素。
//title[@lang]选取所有拥有名为lang的属性的title元素。
//title[@lang="eng"]选取所有拥有值为eng的lang属性的title元素。
/bookstore/book[price>35.00]选取bookstore元素的所有book元素,且其中的price元素的值须大于35.00。
/bookstore/book[price>35.00]/title选取bookstore元素中的book元素的所有title元素,且其中的price元素的值必须大于35.00。

3、选取未知节点(Xpath通配符可以用来选取未知的XML元素)

通配符说明
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。

        案例:

路径表达式结果
/bookstore/*选取bookstore元素的所有子元素。
//*选取文档中的所有元素。
html/node()/meta/@*选择html下面任意节点下的meta节点的所有属性。
//title[@*]选取所有带有属性的title元素。

4、选取若干路径(通过路径表达式中使用“|”运算符来选取若干个路径)

        案例:

路径表达式结果
//bookstore/title|//book/price选取book元素的所有title元素和price元素。
//title|//price选取所有的title和price元素。
/bookstore/book/title|//price选取属于bookstore元素的book元素的title元素,以及所有的title元素。

5、Xpath实战

新建一个hello.html文件:(这是文件源码)

<!-- hello.html -->

<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>

①获取所有的<li>标签:
 

from lxml import etree

html = etree.parse('hello.html')
print(type(html))  # 显示etree.parse() 返回类型

result = html.xpath('//li')

print(result)  # 打印<li>标签的元素集合
print(len(result))
print(type(result))
print(type(result[0]))

运行结果:

 ②获取<li>标签的所有class属性:

from lxml import etree

html = etree.parse('hello.html')
result = html.xpath('//li/@class')

print(result)

运行结果:

③获取<li>标签下href为link1.html的<a>标签: 

from lxml import etree

html = etree.parse('hello.html')
result = html.xpath('//li/a[@href="link1.html"]')

print(result)

运行结果:

④获取<li>标签下所有<span>标签:

from lxml import etree

html = etree.parse('hello.html')

#result = html.xpath('//li/span')
#注意这么写是不对的:
#因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠

result = html.xpath('//li//span')

print(result)

⑤获取<li>标签下的<a>标签里的所有class:

from lxml import etree

html = etree.parse('hello.html')
result = html.xpath('//li/a//@class')

print(result)

运行结果:

⑥获取最后一个<li>的<a>的href: 

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li[last()]/a/@href')
# 谓语 [last()] 可以找到最后一个元素

print(result)

运行结果:

 ⑦获取倒数第二个元素的内容:(小y觉得这里可以获取到元素的内容,爬取文档时更实用一些)

from lxml import etree

html = etree.parse('hello.html')
result = html.xpath('//li[last()-1]/a')

# text 方法可以获取元素内容
print(result[0].text)

运行结果:

⑧获取class值为bold的标签名:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//*[@class="bold"]')

# tag方法可以获取标签名
print(result[0].tag)

 运行结果:

以上便是小y的学习笔记,小y希望和大家共同进步!

欢迎点赞+收藏+关注!

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小 y 同 学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值