活动地址: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希望和大家共同进步!
欢迎点赞+收藏+关注!